Linux 在不使用正则表达式的带换行符的文件内容中搜索带grep的关键字

Linux 在不使用正则表达式的带换行符的文件内容中搜索带grep的关键字,linux,grep,Linux,Grep,我是否有办法执行grep命令,以便: 这是要查找的关键字“主题:这是关键字” 在文件中,这些可能是可能的结果 主题:这是一个\n 关键词 主题:这是\n 关键词 主题:此\n 这是一个关键词 我不知道有多少变化。 有没有一种方法可以在没有正则表达式的情况下使用grep来匹配所有这些场景 否则,更糟糕的情况是,我必须将所有内容复制到另一个文件中,去掉所有新行并连接,然后对其进行grep处理。在这里,我使用了另外两个简单的实用程序对文件进行格式化,以便在不使用正则表达式的情况下对其进行grep处理

我是否有办法执行grep命令,以便:

这是要查找的关键字“主题:这是关键字”

在文件中,这些可能是可能的结果

主题:这是一个\n 关键词

主题:这是\n 关键词

主题:此\n 这是一个关键词

我不知道有多少变化。 有没有一种方法可以在没有正则表达式的情况下使用grep来匹配所有这些场景


否则,更糟糕的情况是,我必须将所有内容复制到另一个文件中,去掉所有新行并连接,然后对其进行grep处理。

在这里,我使用了另外两个简单的实用程序对文件进行格式化,以便在不使用正则表达式的情况下对其进行grep处理

注意,在这个场景中,新的临时换行符总是以“Subject:…”开头,因此grep的输出可能包含行的其余部分,直到下一个“Subject:…”

示例输入文件:

Subject: This is a
 keyword
Sample text here-
Subject: This is
 a keyword
Another text here
Subject: This
 is a keyword
Ending line!
命令:

cat test.txt | tr -d '\n' | sed 's/Subject: /\n&/g' | grep 'Subject: This is a keyword'
样本输出:

请注意,如果即使在单词“Subject:”中也可能出现换行符,则必须编辑该命令


您可以使用
tr
将换行符
\n
转换为NUL字符
\0
grep
转换为空格字符之前的可选NUL字符

从以下位置使用示例输入文件:

$tr'\n'\0'
如果需要,可以将匹配中的NUL字符转换回换行符

$ tr '\n' '\0' < test.txt | grep -aPo 'Subject: This\0? is\0? a\0? keyword' | tr '\0' '\n'
Subject: This is a
 keyword
Subject: This is
 a keyword
Subject: This
 is a keyword
$tr'\n'\0'
或删除NUL字符

$ tr '\n' '\0' < test.txt | grep -aPo 'Subject: This\0? is\0? a\0? keyword' | tr -d '\0'
Subject: This is a keyword
Subject: This is a keyword
Subject: This is a keyword
$tr'\n'\0'
选项:

  • -a
    将二进制输入文件视为文本
  • -P
    启用与Perl兼容的正则表达式(PCRE)
  • -o
    仅打印匹配的零件

为什么不想使用正则表达式呢?对于多行搜索,您需要像pcregrep、ripgrep等grep变体。。或者你可以用awk。。但是为什么你提到在没有正则表达式的情况下完成这项任务呢?我将尝试探索其他grep变体或awk。我只需要一个简单的函数来解决一个简单的问题。一旦输入到函数中,无论是awk、pcregrep、ripgrep(“关键字”、“文件名”),它都应该给我一个匹配项。我不想进入regex,因为我们不是regex专家。关键字的变体太多,如果我必须在文件中搜索10个关键字,正则表达式的变体就会太多
$ tr '\n' '\0' < test.txt | grep -aPo 'Subject: This\0? is\0? a\0? keyword' | tr '\0' '\n'
Subject: This is a
 keyword
Subject: This is
 a keyword
Subject: This
 is a keyword
$ tr '\n' '\0' < test.txt | grep -aPo 'Subject: This\0? is\0? a\0? keyword' | tr -d '\0'
Subject: This is a keyword
Subject: This is a keyword
Subject: This is a keyword