我的Bash任务的一部分包括阅读文本文件,然后将每行分成单词并使用它们。
单词由|
分隔,行以\n
分隔。我们被告知要使用tr
命令,但我找不到一个优雅的解决方案。
一个例子:
Hello | My | Name | Is | Bill
应该给:
Hello
My
Name
Is
Bill
每次迭代一个字。
答案 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
$