我已经研究了一个多小时,但找不到为什么它不起作用。
我正在 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 格式),因为%
文件中未使用该字符。