如何在 sed 替换中转义正则表达式
How to escape regex in sed replace
我想替换文件中的文本。我的正则表达式是 [\s\S\n]*<h1 class='test'>
。
我尝试了以下命令,但没有替换文本。
sed -i.bak 's/[\s\S\n]*<h1 class='test'>//g' 36
sed -i.bak 's/\[\s\S\n\]\*<h1 class=\x27test\x27>//g' 36
文件名为36
grep "[\s\S\n]*<h1 class='test'>" -q 36 && echo "FOUND" || echo "NOTFOUND"
的输出是 FOUND
。
sed
默认情况下仅逐行操作。
要跨行匹配 - 看起来你正在使用 GNU sed - 你需要使用 -z
选项(它将吞噬文件内容并且 sed
将能够“看到”行breaks),然后使用 .
匹配任何字符(在 POSIX 正则表达式中,.
甚至匹配换行符)。注意 [\s\S]
是一个“损坏的”POSIX 模式,因为在 POSIX 括号表达式中,类似 PCRE 的 shorthand 字符 类 被解析为反斜杠和它旁边的一个字符(即 [\s]
匹配 \
或 s
)。
另一个问题是您在单引号字符串中使用了单引号,这是错误的(它们最后被剥离并且您的模式中没有 '
)。
因此,对于 GNU sed
使用
sed -i.bak -z "s/.*<h1 class='test'>//g" 36
对于非 GNU sed,您可以使用描述的技术 here。
我想替换文件中的文本。我的正则表达式是 [\s\S\n]*<h1 class='test'>
。
我尝试了以下命令,但没有替换文本。
sed -i.bak 's/[\s\S\n]*<h1 class='test'>//g' 36
sed -i.bak 's/\[\s\S\n\]\*<h1 class=\x27test\x27>//g' 36
文件名为36
grep "[\s\S\n]*<h1 class='test'>" -q 36 && echo "FOUND" || echo "NOTFOUND"
的输出是 FOUND
。
sed
默认情况下仅逐行操作。
要跨行匹配 - 看起来你正在使用 GNU sed - 你需要使用 -z
选项(它将吞噬文件内容并且 sed
将能够“看到”行breaks),然后使用 .
匹配任何字符(在 POSIX 正则表达式中,.
甚至匹配换行符)。注意 [\s\S]
是一个“损坏的”POSIX 模式,因为在 POSIX 括号表达式中,类似 PCRE 的 shorthand 字符 类 被解析为反斜杠和它旁边的一个字符(即 [\s]
匹配 \
或 s
)。
另一个问题是您在单引号字符串中使用了单引号,这是错误的(它们最后被剥离并且您的模式中没有 '
)。
因此,对于 GNU sed
使用
sed -i.bak -z "s/.*<h1 class='test'>//g" 36
对于非 GNU sed,您可以使用描述的技术 here。