我有一个文件,infile.txt
:
foo bar
hello world
blah blah black sheep
我想得到:
foo
bar
hello
wolrd
blah
blah
black
sheep
我试过这个
echo infile.txt | sed -e 's/[[:space:]]/\n/g' | grep -v '^$'
但它没有识别换行符和输出:
foo
bar
hello
wolrd
blah
blah
black
sheep
如何实现所需的输出?
答案 0 :(得分:3)
sed
版本:(最后不提供新行)
sed '$!G;s/ /\n/g' file
foo
bar
hello
world
blah
blah
black
sheep
G
将新行添加到模式空间,并复制新行后的保留空间
但由于持有空间是空的,它只会增加新线。 $!
阻止它在最后一行上运行
s/ /\n/g
用新行替换所有空格。
另一个sed
版本:(最后不提供新行)
(基于NeronLeVelu
帖子)
sed '$!s/$/\n/g;s/ /\n/g' file
foo
bar
hello
world
blah
blah
black
sheep
工作原理:
$!
不在最后一行执行此操作 - > s/$/\n/g
用$
替换行尾\n
,以便获得两个新行
s/ /\n/g
用换行符替换所有空格。
答案 1 :(得分:2)
这是awk
awk -v OFS="\n" -v ORS="\n\n" '{$1=$1}1' file
foo
bar
hello
world
blah
blah
black
sheep
您也可以使用:
awk '$1=$1' OFS="\n" ORS="\n\n" file
但这更强大
awk '{$1=$1}1' OFS="\n" ORS="\n\n" file
另一个版本:
awk '{gsub(/($| )/,"\n")}1' file
PS,上面的所有awk
都会在最后添加换行符。
如果这是一个问题,这不会在最后添加新行:
awk 'NR>1 {print a"\n"} {gsub(/ /,"\n");a=$0} END {print a}' file
foo
bar
hello
world
blah
blah
black
sheep
答案 2 :(得分:0)
您可以使用以下sed命令
$ sed ':a;N;$!ba;s/\n/\n\n/g;s/ /\n/g' file
foo
bar
hello
world
blah
blah
black
sheep
答案 3 :(得分:0)
sed '$ !s/$/\
/;s/ /\
/g' YourFile