Shell

如何檢查文件的第一行是否包含特定字元串?

  • December 23, 2018

我需要編寫一個 shell 腳本來查找並列印以字元串開頭的目錄中的所有文件:#include。現在,我知道如何使用以下方法檢查文件中是否存在字元串:

for f in `ls`; do
   if grep -q 'MyString' $f; then:
       #DO SOMETHING
   fi

但是我怎樣才能把它應用到第一行呢?我想也許可以創建第一行的變數並檢查它是否以 開頭#include,但我不知道該怎麼做。我嘗試了該read命令,但未能讀入變數。

我想听聽解決這個問題的其他方法;也許awk?無論如何,請記住,我需要檢查第一行是否以 開頭#include,而不是它是否包含該字元串。這就是我發現這些問題的原因:如何僅在第一行匹配特定模式時列印文件內容? https://stackoverflow.com/questions/5536018/how-to-print-matched-regex-pattern-using-awk 他們並沒有完全幫助。

很容易檢查第一行是否以#includein (GNU and AT&T) sed 開頭:

sed -n '1{/^#include/p};q'   file

或簡化(和 POSIX 兼容):

sed -n '/^#include/p;q'   file

#include僅當文件包含在第一行中時才會有輸出。那隻需要閱讀第一行即可進行檢查,因此速度會非常快。

因此,所有文件(使用 sed)的 shell 循環應該是這樣的:

for file in *
do
   [ "$(sed -n '/^#include/p;q' "$file")" ] && printf '%s\n' "$file"
done

如果pwd 中只有文件(不是目錄)。

如果您需要列印文件的所有行,則類似於發布的第一個程式碼的解決方案將起作用(GNU 和 AT&T 版本):

sed -n '1{/^#include/!q};p'  file

或者,(BSD 兼容的 POSIXfied 版本):

sed -ne '1{/^#include/!q;}' -e p  file

或者:

sed -n '1{
          /^#include/!q
        }
        p
      '  file

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