找到带有特定字符串的行,然后将其删除';在bash的末尾添加换行符

找到带有特定字符串的行,然后将其删除';在bash的末尾添加换行符,bash,newline,Bash,Newline,我正在准备一份报告的文件。我所拥有的是这样的: foo bar bar oof bar oof foo bar bar foo bar bar oof bar off foo bar bar 我试图得到如下输出: foo bar bar oof bar oof foo bar bar foo bar bar oof bar off foo bar bar 我想搜索一个字符串,在本例中是“foo”,在找到该字符串的行中,我必须删除换行符 我确实搜索过,但我只能找到同时删除“

我正在准备一份报告的文件。我所拥有的是这样的:

foo 
bar bar oof 
bar oof 
foo 
bar bar
foo bar bar oof
bar off
foo bar bar
我试图得到如下输出:

foo 
bar bar oof 
bar oof 
foo 
bar bar
foo bar bar oof
bar off
foo bar bar
我想搜索一个字符串,在本例中是“foo”,在找到该字符串的行中,我必须删除换行符


我确实搜索过,但我只能找到同时删除“foo”的解决方案。我该怎么做

使用
sed
,您可以很容易地做到这一点,例如:

$ sed '/^foo$/N;s/\n/ /' file
foo bar bar oof
bar oof
foo bar bar
解释

  • /^foo$/
    查找仅包含
    foo的行

  • N
    在模式空间中读取/追加下一行输入

  • s/\n/
    空格替换
    '\n'


  • 使用
    awk

    awk -v search='foo' '$0 ~ search{printf $0; next}1' infile
    
    如果您的字段在换行符之前没有前导空格,您可以像下面一样使用
    printf$0

    awk -v search='foo' '$0 ~ search{printf $0 OFS; next}1' infile
    
    测试结果:

    $ cat infile
    foo 
    bar bar oof 
    bar oof 
    foo 
    bar bar
    
    $ awk -v search='foo' '$0 ~ search{printf $0; next}1' infile
    foo bar bar oof 
    bar oof 
    foo bar bar
    
    说明:

    • -v search='foo'
      -set变量
      search
    • $0~搜索
      -如果行/记录/行包含变量中提到的regexp/pattern/string
    • {printf$0;next}
      -不使用记录分隔符打印当前记录并转到下一行
    • }1
      1结尾处执行默认操作,即打印当前记录/行

    成功了!我是“sed”的新手,不知道“^”、“$”和“N”的用法;美国国旗。谢谢,加入俱乐部
    sed
    是一种需要慢慢消化的动物。有点像吃鲸鱼。。。每次咬一口
    :)
    我意识到我需要包含
    foo
    的行,不管它是否是行中唯一的字符串。因此,我将
    ^foo$
    替换为简单的
    foo
    。对我有效。祝您的脚本编写顺利(以及
    sed
    awk
    )。在shell、
    awk
    sed
    之间的Linux机器上几乎没有什么做不到的。加在一起就是文字处理的瑞士军刀。我确实意识到我需要“打印F$0 OFS”的空间。这也行得通。非常感谢。