如何使用 grep 匹配以特殊字符开头的行?

如何使用 grep 匹配以特殊字符开头的行?

我的目录中有许多 .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;

笔记

  1. find并且xargs这里不需要。使用该-r选项,grep可以通过子目录进行递归搜索。

  2. --include '*.txt'限制grep与 glob 匹配的文件*.txt

  3. ^匹配行的开头。 [[:space:]]*匹配零个或多个空白字符。 =匹配等号。在 POSIX 正则表达式中,没有什么特殊之处,=因此可以将其视为任何其他字符。

  4. 以 结尾 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 一次只会提供一个文件。

相关内容