Sed 使文件每行一个字时保持换行符?
我有一个这样的文件,Sed 使文件每行一个字时保持换行符?,sed,text-files,newline,Sed,Text Files,Newline,我有一个这样的文件,infle.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 如何实现
infle.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
如何实现所需的输出?您可以使用下面的sed命令
$ sed ':a;N;$!ba;s/\n/\n\n/g;s/ /\n/g' file
foo
bar
hello
world
blah
blah
black
sheep
- 单新行字符替换为双新行字符
- 同样,空格被新行字符替换
$ sed ':a;N;$!ba;s/\n/\n\n/g;s/ /\n/g' file
foo
bar
hello
world
blah
blah
black
sheep
- 单新行字符替换为双新行字符
- 同样,空格被新行字符替换
这是一个
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
另外,上面的所有
awk
在末尾添加了一个换行符
如果出现问题,则不会在末尾添加新行:
awk 'NR>1 {print a"\n"} {gsub(/ /,"\n");a=$0} END {print a}' file
foo
bar
hello
world
blah
blah
black
sheep
这是一个
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
另外,上面的所有
awk
在末尾添加了一个换行符
如果出现问题,则不会在末尾添加新行:
awk 'NR>1 {print a"\n"} {gsub(/ /,"\n");a=$0} END {print a}' file
foo
bar
hello
world
blah
blah
black
sheep
A
sed
version:(末尾不给出新行)
G
向图案空间添加新行,并在新行后复制保留空间。但由于保留空间是空的,它只会添加新行。<代码>$代码>防止它在最后一行运行。
s//\n/g
用新行替换所有空格
另一个
sed
version:(末尾不给出新行)(基于
NeronLeVelu
post)
工作原理:$
不要在最后一行执行此操作->s/$/\n/g
将行末的$
替换为\n
,这样您将获得两行新代码。s//\n/g
用换行符替换所有空格。Ased
version:(结尾不换行)
G
向图案空间添加新行,并在新行后复制保留空间。但由于保留空间是空的,它只会添加新行。<代码>$代码>防止它在最后一行运行。
s//\n/g
用新行替换所有空格
另一个
sed
version:(末尾不给出新行)(基于
NeronLeVelu
post)
工作原理:$
不要在最后一行执行此操作->s/$/\n/g
将行末的$
替换为\n
,这样您将获得两行新代码。s//\n/g
用换行符替换所有空格。发布输出。我确实从中得到了三行,比如foo^Jbar^J
和hello^Jworld^J
等等。抱歉^J
是一个新行字符(复制粘贴此字符)。我调整replyPost以显示您的输出。我确实从中得到了三行,比如foo^Jbar^J
和hello^Jworld^J
等等。抱歉^J
是一个新行字符(复制粘贴此字符)。我修改了回复,你也可以解释一下:a;N、 美元!ba
您的sed的一部分
。已解释。我想你一定知道……你能解释一下:a;N、 美元!ba
您的sed的一部分
。已解释。我想你一定知道这一点……做得好,为新行使用原始内部缓冲区+1做得好,为新行+1+1使用原始内部缓冲区。也可以使用awk'{gsub(/(|$)/,RS)}1'文件
或sed-r/(|$)/\n/g'文件
,但IMHOawk-v of s=“\n”-v ORS=“\n\n”{1=$1}1”文件
是明确实现所需内容的正确方法(即,将空格字段分隔符更改为换行符,并将换行符输出记录分隔符更改为2个换行符)而且它很容易扩展。@EdMorton更新了我的帖子。PSsed
在末尾给出一个空行,因此它可能会被写为:sed'$!s/$/\n/g;s//\n/g'
awk one也会在末尾给出一个空行,但我认为这很好,因为文件中的每一组行后面都有一个空行。+1.这也可以用awk'{gsub(/(|$)/,RS)}1'文件
或sed-r/(|$)/\n/g'文件
但IMHOawk-v-OFS=“\n”-v-ORS=“\n\n”{1=$1}1”文件
是正确的方法,可以清楚明确地实现所需的功能(即,将空格字段分隔符更改为换行符,并将换行符输出记录分隔符更改为2个换行符)而且它很容易扩展。@EdMorton更新了我的帖子。PSsed
在末尾给出一个空行,因此它可能会被写为:sed'$!s/$/\n/g;s//\n/g'
awk one也会在结尾给出一个空行,但我认为这很好,因为文件中的每一组行后面都有一个空行。