2017-04-04 58 views
0

我試圖grep兩個字符串和下一個字,直到從文件中的字符。 當前內容看起來像這樣:grep直到char字符

Package: wdiff\0aVersion: 1.2.2-1build1\0aArchitecture: amd64\0aMaintainer:... 
... 

Package: python\0aVersion: 2.7.2-1build1\0aArchitecture: amd64\0aMaintainer:.. 
... 

等等。 我想grep文件的「包裝:」和「版本」一起直到"\0a"。 使得輸出將是:

Package: wdiff Version: 1.2.2-1build1 
Package: python Version: 2.7.2-1build1 

等等,優選用grep。

只是爲了澄清 - 這是一個很長的文件,用「\ 0a」分隔很多單詞,我只需要2個單詞和它們之後的所有內容,直到「\ 0a」。

感謝您的親切幫助!

+1

*直到「\ a0」* - 爲什麼'build1'錯過? – RomanPerekhrest

+1

在輸入文件中是否有文字'\ 0a'? – anubhava

+0

你的例子有'\ 0a',但是你的文字說'\ a0' - 這是什麼?這些字面字符,還是你的意思是換行符? –

回答

0

這裏是一個單一AWK命令獲取的輸出:

awk -F '\\\\0a' 'NF>1{print $1, $2}' file 

Package: wdiff Version: 1.2.2-1build1 
Package: python Version: 2.7.2-1build1 

-F '\\\\0a'\0a作爲輸入字段分隔符。

+0

太棒了,謝謝!然而,我確實有一些行,我在包和版本之間有另一個詞,並輸出它。例如:「Package:apache \ 0aSource:blabla \ 0aVersion:3.2.1」等等。如何保持Source:輸出結果? –

+0

確定然後使用:'awk -F'\\\\ 0a''NF> 1 {打印$ 1,($ 2〜/ ^版本:/?$ 2:$ 3)}'文件' – anubhava

+0

是的,漂亮!非常感謝。上投票:)如果我想在未來添加另一種模式,那會從線上捕獲第三個詞,我該如何添加它? –

-1

到grep的話文件「包」和「版本」一起上 直到「\ A0」

的grep讓你找到比賽,但它不會替換「不需要」的字符。
使用的grep + 的組合的sed

cat testfile | grep -Po 'Package: .+?Version: .+?(?=\\0a)' | sed 's/\(.*\)\\0a.*\(Version.*\)/\1 \2/' 

的示例性輸出:

Package: wdiff Version: 1.2.2-1build1 
Package: python Version: 2.7.2-1build1 
+0

感謝您的回覆!我想你可能想念我。讓我們假設它是一個非常長的文件,沒有用行隔開,我想grep單詞「Package:」以及後面的所有字符,直到字符「\ 0a」和「Version:」及其後的所有字符,直到字符「\」 0a「。還有其他的詞語,如「維護者:」,「架構:」等。 –

+0

@JohnDoe,你應該提到有一個任意的文字,而不是線條的換行符 – RomanPerekhrest

+0

@JohnDoe,看到我的更新 – RomanPerekhrest

0

的一個選項是:

awk -F\\ '{ pos=match($2,"build");print $1" "substr($2,3,pos-3) }' 

我們使用awk和分隔符「\」來分割文本我們希望將第二個元素從第三個字符剝離到單詞「build」因此,我們使用awk中的匹配函數來查找字符串中的位置,然後進一步取出從第三個字符開始到出現「build」字樣的第二個字符串(減去3以考慮字符串開頭的「0a」)。