无法让 GNU grep 2.12 处理正则表达式中的 LF 字符

无法让 GNU grep 2.12 处理正则表达式中的 LF 字符

我已经研究了一个多小时,但找不到为什么它不起作用。

我正在 HTML 文档中搜索“\nSome text”。够简单的。

但他执行的命令不起作用:

grep -Po '(?s)<h2>\nSome text' input.html > output.html
grep -Po '(?s)<h2>\\nSome text' input.html > output.html

我需要“-P”开关,因为 grep 的基本正则表达式引擎不支持多行。

我不知道还能尝试什么。任何想法?

谢谢。

-- 编辑:输入文件仅包含以下内容:

<h2>LF (ie. \n)
Some text

答案1

您需要两件事来匹配换行符(因此多行),使用grep

  • -z较新的 GNU 选项grep,它将导致行由 ASCII NUL 而不是换行符分隔

  • (?s)被称为 DOTALL 修饰符(带有grep -P),它将导致grep与换行符(LF/CR)匹配.(点)

因此,在您的情况下,以下内容应该有效:

grep -aPoz '(?s)<h2>.Some text' file.txt

这里.将匹配新行。

如果您有 CR 和 LF(或不确定),那么:

grep -aPoz '(?s)<h2>.{1,2}Some text' file.txt

由于grep读取前几个字节来确定文件类型,因此您的文件被 视为二进制文件grep-a将导致该文件被视为文本文件。

答案2

grep 默认情况下搜索行,因此通常不能用于查找行之间的字符。

当我搜索换行符时,我通常将换行符(假设此处为 UNIX 换行符)替换为我知道文本中不存在的不同字符,如下所示:

cat file.html | sed 's/\n/%\n/g' | grep '<h2>%' | tr --delete % 

但是,在我看来,您似乎是在行尾搜索,可以这样搜索:

grep '<h2>$' file.html > newfile.html

因为$是匹配行尾(^匹配行首)的正则表达式(7)。

编辑:如果我弄错了(我怀疑是这样),你需要<h2>\nSome text尝试这样的事情:

cat file.html | sed 's/<h2>\n/ñ/g' | grep 'ñSome text' | sed 's/ñ/<h2>\n/g' > newfile.html

使用与文本中ñ实际s不同的字符(UTF-8 中的序列) 。ñ

或者尝试组合:

cat file.html | tr \\n % | sed 's/<h2>%/ñ/g' | tr % \\n | grep 'ñSome text' | sed 's/ñ/<h2>\n/g'

使用单个字符(UTF-8 格式),因为%文件中未使用该字符。

相关内容