Shell
如何檢查文件的第一行是否包含特定字元串?
我需要編寫一個 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 他們並沒有完全幫助。
很容易檢查第一行是否以
#include
in (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