将文件变为每行一个单词时保持换行符?

时间:2014-08-26 06:32:34

标签: sed text-files newline

我有一个文件,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

如何实现所需的输出?

4 个答案:

答案 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
  1. 在每行的末尾添加一个新行,但最后一行
  2. 用新行替换空格