我需要编写一个 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 开头:或简化(和 POSIX 兼容):
#include
仅当文件包含在第一行中时才会有输出。那只需要阅读第一行即可进行检查,因此速度会非常快。因此,所有文件(使用 sed)的 shell 循环应该是这样的:
如果pwd 中只有文件(不是目录)。
如果您需要打印文件的所有行,则类似于发布的第一个代码的解决方案将起作用(GNU 和 AT&T 版本):
或者,(BSD 兼容的 POSIXfied 版本):
或者:
要打印文件的内容而不是其名称,请将
printf
命令替换为cat < "$file"
.如果您
awk
支持nextfile
扩展,并且您不关心打开非常规文件的潜在副作用:上面,我们添加了一个
./
前缀,我们随后将其剥离FILENAME
以避免包含=
字符的文件名(或名为 的文件-
)出现问题。使用
zsh
,您可以替换./*
为./*(-.)
仅将常规文件(或符号链接到常规文件,如上述[ -f ... ]
方法)传递给awk
.或者打印文件内容而不是名称:
(那个是便携式的)。
请注意,
-q
启用选项后,grep
即使发生错误,也会以零状态退出。这个问题是一个完美的例子,其中 bash 和 sed 解决方案非常复杂,但是使用 (GNU) awk 可以更简单地完成任务: