2017-10-18 85 views
1

我正在尝试为报表准备文件。我已经是这样的:查找带有特定字符串的行,然后在bash中删除它的换行符字符

foo 
bar bar oof 
bar oof 
foo 
bar bar 

我想要得到这样的输出:

foo bar bar oof 
bar off 
foo bar bar 

我想搜索字符串,在这种情况下,“富”,和内找到字符串的行我必须删除换行符。

我做了搜索,但我只能找到'foo'也被删除的解决方案。我怎样才能做到这一点?

回答

0

你可以做到这一点很容易与sed,例如:

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

说明只包含foo

  • N

    1. /^foo$/发现线/追加下一行输入模式空间。

    2. s/\n/ /space替代'\n'

  • +0

    它的工作!我刚接触'sed',不知道'^','$','N; s'标志的用法。谢谢。 – leafymilkfish

    +0

    加入俱乐部。 “sed”是你必须慢慢消化的动物之一。有点像吃鲸鱼......每次只吃一口'')' –

    +0

    我意识到我需要包含'foo'的行,不管它是否是唯一的字符串。所以我用'foo'替换了'^ foo $'。 – leafymilkfish

    1

    使用awk

    awk -v search='foo' '$0 ~ search{printf $0; next}1' infile 
    

    您可以使用printf $0 OFS像下面,如果你的领域没有换行字符之前前导空格

    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' - 设置变量search
    • $0 ~ search - 如果线/记录/行包含变量
    • {printf $0; next}提到的正则表达式/模式/字符串 - 打印当前记录没有记录分隔符,然后转到下一行
    • }1 1最后做默认操作,即打印当前记录/行。
    +0

    我知道我需要“printf $ 0 OFS”空间。这也适用。谢谢! – leafymilkfish

    +0

    不客气 –

    相关问题