我有许多文件,其中的行以 main 开头,后跟左大括号,并以包含右大括号的行结束。我想删除这些行:
main {
top:190px;
margin-left:auto;
margin-right:auto;
width:70%
}
我尝试过这样的命令,其中我转义了大括号:
find . -name "*.html" -exec sed -i '/^main.*\{/,/^\}/d' {} +
并收到如下错误消息:
sed: -e expression #1, char 11: Invalid preceding regular expression
当我不转义大括号时,我不会收到错误消息,但不会删除这些行。
我在运行 GNU bash 版本 5.0.3(1)-release (x86_64-pc-linux-gnu) 的系统上使用 GNU sed 版本 4.7
最佳答案
前面的正则表达式无效
错误是由您使用的无效正则表达式引起的。由于没有 -E
标志,因此您的 sed 命令将使用 POSIX BRE 正则表达式规则进行解释,并且 \{
/\}
用于定义范围量词(也称为限制量词或区间量词)。
因此,您所需要的只是添加 -E
选项,
find . -name "*.html" -exec sed -E -i '/^main.*\{/,/^\}/d' {} +
或者,从 {
和 }
中删除逃逸:
find . -name "*.html" -exec sed -i '/^main.*{/,/^}/d' {} +
参见this online demo .
当然,如果您只需要在 main
和 {
之间只有空格字符时才匹配 {
,请替换 /^main.*{/
与 /^main[[:space:]]*{/
(POSIX BRE)。
关于regex - 我找不到可以删除起始行和结束行包含大括号的一组行的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69112689/