BASH:使用tr将一行分成单词

时间:2013-05-22 19:59:00

标签: bash tr

我的Bash任务的一部分包括阅读文本文件,然后将每行分成单词并使用它们。

单词由|分隔,行以\n分隔。我们被告知要使用tr命令,但我找不到一个优雅的解决方案。

一个例子:

Hello | My | Name | Is | Bill

应该给:

Hello
My
Name
Is
Bill

每次迭代一个字。

6 个答案:

答案 0 :(得分:4)

您只需要调用tr来完成这项工作:

$ echo "Hello | My | Name | Is | Bill" | tr -cs '[:alpha:]' '\n'
Hello
My
Name
Is
Bill
$

-c选项用于补充'第一种模式中的字符; -s选项'挤压'重复的替换字符。因此,任何不是字母的东西都会转换为换行符,但连续的换行符会被压缩到一个换行符。

显然,如果你需要保留其他人|可以|打电话我|弗雷德'如果输出的第一行有两个单词,那么你必须更加努力地工作:

$ echo "Everyone else | can | call | me | Fred" |
> tr '|' '\n' |
> sed 's/  *$//;s/^  *//'
Everyone else
can
call
me
Fred
$

这里的sed脚本删除了前导空格和尾随空格,使中间空格保持不变。如果需要,可以用一个空白替换多个空白,依此类推。您无法使用tr来有条件地替换给定字符(例如,更改某些空格并让其他人保持独立)。

答案 1 :(得分:1)

使用tr:

echo "Hello | My | Name | Is | Bill" | tr -s '\| ' '\n'

或者如果您决定给awk一个机会:

echo "Hello | My | Name | Is | Bill" | awk -F '\|' '{for (i=1; i<=NF; i++) {
      sub(/ /, "", $i); print $i}}'

答案 2 :(得分:1)

其他一些选择:

<强> AWK:

awk -F'\\| '  -v OFS="\n" '$1=$1'

示例:

kent$  echo "Hello | My | Name | Is | Bill" |awk -F'\\| '  -v OFS="\n" '$1=$1'                                                                                              
Hello 
My 
Name 
Is 
Bill

<强>的grep

grep -o '[^ |]*'

示例:

kent$  echo "Hello | My | Name | Is | Bill"|grep -o '[^ |]*' 
Hello
My
Name
Is
Bill

<强> SED

sed 's/ | /\n/g'

示例:

kent$  echo "Hello | My | Name | Is | Bill" |sed 's/ | /\n/g'  
Hello
My
Name
Is
Bil

答案 3 :(得分:1)

我最喜欢的perl:)

echo "Hello | My | Name | Is | Bill" | perl -pe 's/\s*\|\s*/\n/g'

也会删除多余的空格,所以

echo "Hello | My | Name | Is | Bill" | perl -pe 's/\s*\|\s*/\n/g' | cat -vet

将打印

Hello$
My$
Name$
Is$
Bill$

答案 4 :(得分:0)

这段代码应该这样做,转换'|'到换行符,删除前导/尾随空格:

echo "Hello | My | Name | Is | Bill" | tr '|' '\n' | tr -d [:blank:]

答案 5 :(得分:0)

文件临时:你好|我的名称|是|比尔

$ cat temp | tr '|' '\n' | sed 's/^ *//g'
Hello 
My 
Name 
Is 
Bill
$

sed部分摆脱了前导空格(因为'|'和单词之间有一个空格。这也适用于“Hello everyone | My | Name | Is | Bill”:

$ cat temp | tr '|' '\n' | sed 's/^ *//g'
Hello everyone 
My 
Name 
Is 
Bill
$