如果一行包含字串,Grep 保留(輸出)整個 .txt 檔案

如果一行包含字串,Grep 保留(輸出)整個 .txt 檔案

我知道

grep -rhI "# Active" > out.txt 

將輸出# Active包含搜尋目錄中的任何行,但我想要整個 .txt 檔案內容,因此範例

範例.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

因此,如果我 grep for# Active我希望它不僅輸出這些 .txt 檔案中包含的行# Active,還輸出所有其他行,例如

輸出.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

答案1

對於非 GNU 版本的grep,不太可能有-z,或者如果需要可移植性...

grep -q pattern file && cat file

-q抑制任何輸出,但通常,退出狀態是根據是否找到模式匹配來設定的。使用模式匹配grep返回成功代碼0,相當於真的並且允許cat執行該指令。

答案2

通常,grep 只會顯示符合行:

$ grep -rhI "# Active"
Line3 # Active

要查看整個文件,請新增標誌-z

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-z是一個 GNU 擴展,它告訴 grep 不要使用換行符號作為「行」分隔符,而是使用 NUL 字元。由於文字檔案中通常不包含 NUL 字符,因此這會告訴 grep 讀取整個文件,就好像它是單一「行」一樣。因此,如果存在匹配,則列印整個文件。

在 BSD/OSX 版本的 grep 上,NUL 輸入選項不可用,並且-z有其他含義。

其他 grep 選項

-r告訴 grep 遞歸搜尋檔案和目錄。

-I告訴 grep 忽略二進位文件

-h告訴 grep 列印符合項目而不附加檔案名稱。

答案3

sed選擇:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

該腳本的工作原理是在舊緩衝區中累積行h(並刪除它們),直到遇到匹配的行,此時它會x更改緩衝區並執行n(即列印並獲取下一行),直到沒有更多輸入。

答案4

如果您想對多個文件執行此操作:

cat `grep -rIl "# Active" *`

Grep 將傳回檔案名稱列表,而 cat 將列印它們。

相關內容