如何根據某種表達方式使sed
篩選匹配行,但忽略不匹配的行,而不是讓它們打印?已經sed忽略不匹配的行
作爲一個實例,我想在一組文件上運行scalac
(Scala編譯器),並從其-verbose
輸出中讀取輸出的.class
文件。 scalac -verbose
會輸出一堆消息,但我們只對[wrote some-class-name.class]
這種形式感興趣。 什麼我目前做的是這個(|&
是bash的4.0對管標準錯誤的方式到下一個程序):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
這將提取我們感興趣的消息的文件的名稱,但會也讓所有其他消息通過不變!當然,我們可以這樣做,而不是這樣的:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
其作品,但看起來非常像周圍的真實問題,這就是如何指導sed
忽略從輸入不匹配的行會。那麼我們該怎麼做?
在OS X 10.8.2上,當我得到'undefined label'x; d;:x''時,我必須用換行符而不是分號來分隔'tx'和'd'。 – davidchambers
更好:'sed -e's /.../.../'-e'tx'-e'd'-e':x''(在[類似問題](http ://stackoverflow.com/a/1252191/312785))。 – davidchambers
如果沒有提供標籤,'t'將轉移到腳本的末尾,因此更簡單:'sed -e's /.../.../'-e't'-e'd''。 –