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命令

$ 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
    用换行符替换所有空格。

    A
    sed
    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'文件
    ,但IMHO
    awk-v of s=“\n”-v ORS=“\n\n”{1=$1}1”文件
    是明确实现所需内容的正确方法(即,将空格字段分隔符更改为换行符,并将换行符输出记录分隔符更改为2个换行符)而且它很容易扩展。@EdMorton更新了我的帖子。PS
    sed
    在末尾给出一个空行,因此它可能会被写为:
    sed'$!s/$/\n/g;s//\n/g'
    awk one也会在末尾给出一个空行,但我认为这很好,因为文件中的每一组行后面都有一个空行。+1.这也可以用
    awk'{gsub(/(|$)/,RS)}1'文件
    sed-r/(|$)/\n/g'文件
    但IMHO
    awk-v-OFS=“\n”-v-ORS=“\n\n”{1=$1}1”文件
    是正确的方法,可以清楚明确地实现所需的功能(即,将空格字段分隔符更改为换行符,并将换行符输出记录分隔符更改为2个换行符)而且它很容易扩展。@EdMorton更新了我的帖子。PS
    sed
    在末尾给出一个空行,因此它可能会被写为:
    sed'$!s/$/\n/g;s//\n/g'
    awk one也会在结尾给出一个空行,但我认为这很好,因为文件中的每一组行后面都有一个空行。