![如何使用 grep 匹配以特殊字符开头的行?](https://linux22.com/image/116557/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20grep%20%E5%8C%B9%E9%85%8D%E4%BB%A5%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E5%BC%80%E5%A4%B4%E7%9A%84%E8%A1%8C%EF%BC%9F.png)
我的目录中有许多 .txt 文件,其中包含以“=”开头的行
例如:a.txt 有以下行(开头有空格)
=putSomething here;
如何编写与上面的行匹配的 grep 查询?我尝试了以下方法,
find . -name "*.txt" | xargs grep -rn "^[=].*$"
答案1
让我们看一下这个示例文件:
$ cat file.txt
=putSomething here;
.txt
现在,要在当前目录中查找所有此类文件:
$ grep -n '^[[:space:]]*=' *.txt
file.txt:1: =putSomething here;
如果你想.txt
在当前目录中查找所有此类文件并且它的所有子目录,然后使用:
$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1: =putSomething here;
file.txt:1: =putSomething here;
笔记
find
并且xargs
这里不需要。使用该-r
选项,grep
可以通过子目录进行递归搜索。--include '*.txt'
限制grep
与 glob 匹配的文件*.txt
。^
匹配行的开头。[[:space:]]*
匹配零个或多个空白字符。=
匹配等号。在 POSIX 正则表达式中,没有什么特殊之处,=
因此可以将其视为任何其他字符。以 结尾 grep 正则表达式
.*$
不会更改匹配的行。.*$
如果有任何字符或后面没有字符则匹配。使用的唯一原因.*$
是更改 grep 突出显示的匹配文本。
答案2
以 开头的行将=
转换为正则表达式^=
。
您的查找命令应该是:
find . -name "*.txt" | xargs grep '^='
或者,更好(避免无用的使用xargs
):
find . -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} +
(这里,由于结尾+
,一堆文件只执行了一个grep)
答案3
尝试了下面的命令,它似乎有效。
grep -rn '^ *=' **/*txt
答案4
grep
作为递归and 的替代xargs
:
$ find /dir -type f -name "*.txt" -exec grep -q '^[[:space:]]*=' {} ';' -print
这将在/dir
(和下面)查找名称与给定模式匹配的所有常规文件。对于每个这样的文件,如果grep -q '^[[:space:]]*='
以零退出状态退出(该模式与文件中的某处匹配),则输出其名称。
或者,如果您只想查看线条本身:
$ find /dir -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} '+'
最后+
将为每次调用提供尽可能多的文件名,grep
而在我的第一个示例中使用;
as 一次只会提供一个文件。