2017-10-18 84 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

    不客氣 –

    相關問題