BASH:使用tr将一行分隔成单词
我的Bash作业的一部分包括读取一个文本文件,然后将每一行分割成单词并使用它们 单词用BASH:使用tr将一行分隔成单词,bash,tr,Bash,Tr,我的Bash作业的一部分包括读取一个文本文件,然后将每一行分割成单词并使用它们 单词用|分隔,行用\n分隔。我们被告知使用tr命令,但我找不到一个优雅的解决方案 例如: Hello | My | Name | Is | Bill 应提供: Hello My Name Is Bill 每次迭代一个单词。此代码应执行此操作,将“|”转换为换行符,删除前导/尾随空格: echo "Hello | My | Name | Is | Bill" | tr '|' '\n' | tr -d [:blan
|
分隔,行用\n
分隔。我们被告知使用tr
命令,但我找不到一个优雅的解决方案
例如:
Hello | My | Name | Is | Bill
应提供:
Hello
My
Name
Is
Bill
每次迭代一个单词。此代码应执行此操作,将“|”转换为换行符,删除前导/尾随空格:
echo "Hello | My | Name | Is | Bill" | tr '|' '\n' | tr -d [:blank:]
档案管理员:你好|我的|名字|是|比尔
$ cat temp | tr '|' '\n' | sed 's/^ *//g'
Hello
My
Name
Is
Bill
$
sed部分去掉了前导空格(因为“|”和单词之间有空格。这也适用于“Hello everyone | My | Name | is | Bill”:
使用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}}'
echo“Hello | My | Name | Is | Bill”| awk-F'\\\\\''''''''{for(i=1;i一些其他选项:
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
kent$ echo "Hello | My | Name | Is | Bill"|grep -o '[^ |]*'
Hello
My
Name
Is
Bill
kent$ echo "Hello | My | Name | Is | Bill" |sed 's/ | /\n/g'
Hello
My
Name
Is
Bil
grep
grep -o '[^ |]*'
例如:
kent$ echo "Hello | My | Name | Is | Bill" |awk -F'\\| ' -v OFS="\n" '$1=$1'
Hello
My
Name
Is
Bill
kent$ echo "Hello | My | Name | Is | Bill"|grep -o '[^ |]*'
Hello
My
Name
Is
Bill
kent$ echo "Hello | My | Name | Is | Bill" |sed 's/ | /\n/g'
Hello
My
Name
Is
Bil
sed
sed 's/ | /\n/g'
例如:
kent$ echo "Hello | My | Name | Is | Bill" |awk -F'\\| ' -v OFS="\n" '$1=$1'
Hello
My
Name
Is
Bill
kent$ echo "Hello | My | Name | Is | Bill"|grep -o '[^ |]*'
Hello
My
Name
Is
Bill
kent$ echo "Hello | My | Name | Is | Bill" |sed 's/ | /\n/g'
Hello
My
Name
Is
Bil
我最喜欢的perl:)
也会移除多余的空间,所以
echo "Hello | My | Name | Is | Bill" | perl -pe 's/\s*\|\s*/\n/g' | cat -vet
将打印
Hello$
My$
Name$
Is$
Bill$
您只需调用一次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
有条件地替换给定字符(例如,更改某些空格而不使用其他空格).那么你找到了什么解决方案,即使它不是一个优雅的解决方案?谢谢你的回答,但我必须用tr:\这是一个伟大的集合,但是grep-o'[^ |]*'
会错误地打断下一个字符串回显“你好|我的名字|是|比尔”
)@jm666您是对的,回答中的grep仅适用于OP的示例。您评论中的文本将由grep通过查看regex来解决。例如,grep-Po'^ |\\\K.*(?=\\\\\\\\$)这个代码看起来很优雅,同时还有其他问题,当我醒来的时候会尝试解决它!只是另一个附加的,如果我需要保存每一个单词,什么是最好的方法?编辑->对不起我的无知:)刚刚完成了一个C++项目,得到了一个BASH的任务,甚至我们从未研究过它。=]工程学校很烂:DIn哪种语言?bash
——使用数组:words=($(echo“$phrase”[tr-cs'[:alpha:][''\n'))
(请参见bash
手册,但也可以。)此实现将保存单词数组中的每个单词,对吗?单词[0]=您好,单词[1]=我的…,等等。它不应该是一种循环吗?我会阅读手册。将[:alpha:][/code>字符类与tr
结合使用是我以前从未见过的。我发现尝试使用回声“Hello | My | First Name | Is | Bill”
这是行不通的:)我只是提供了一种从OP的输入到输出的方法,只使用tr,这似乎是他们所要求的