我知道
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 將列印它們。