Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH:使用tr将一行分隔成单词_Bash_Tr - Fatal编程技术网

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

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

我的Bash作业的一部分包括读取一个文本文件,然后将每一行分割成单词并使用它们

单词用
|
分隔,行用
\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,这似乎是他们所要求的