Text-Processing

列出在特定行不包含特定字元串的文件

  • September 18, 2018

我正在嘗試查找所有帶有副檔名的文件.md

find . -type f -name "*.md"

然後我想過濾掉那些第二行(行號= 2)不包含這個確切的字元串開頭和結尾的文件author: Mr. Xab Ycd

我該怎麼做第二部分?這樣做grep會效率低下,因為它會檢查整個文件。

find . -type f -name '*.md' -exec \
 sh -c 'sed 1d\;q "$1" | grep -qvx "author: Mr. Xab Ycd"' sh {} \; -print

上述命令包含所有要求,而無需通過 shell 管道傳遞可能令人困惑的文件名。

第一部分是(幾乎)從您的原樣複製的 - 查找名為*.md. 我已將雙引號更改為“硬”單引號;您的情況沒有功能差異,但是如果您想查找名為的文件,*.$md則雙引號將嘗試擴展變數$md.

匹配的文件名然後通過另一個測試通過-exec. exec 的參數是一個小的 shell 腳本,它的作用是確定給定文件名在$1. 該sed命令僅列印第二行;有不同的方法可以做到這一點,例如:

  • sed -n '2{p;q;}'或者
  • sed '1d;q

第一個說“預設情況下不列印行,但是當你看到第二行時,列印它然後退出”。第二個說“預設列印行,但刪除第一行,然後退出(在第二行);該q命令將在退出之前列印目前緩衝區。

該行文本(如果有)被傳遞給 grep,grep 檢查整行是否匹配(或不匹配)給定文本。如果匹配 ( -v),則整個命令成功並因此find列印文件名。

引用自:https://unix.stackexchange.com/questions/469269