首页 > 解决方案 > 我找不到将删除开始行和结束行包含大括号的一组行的正则表达式

问题描述

我有许多文件,其中的行以 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

标签: regexsedcurly-braces

解决方案


Invalid preceding regular expression错误是由您使用的无效正则表达式引起的。由于没有-E标志,您的 sed 命令将使用 POSIX BRE 正则表达式规则进行解释,并且\{/\}用于定义范围量词(也称为限制或间隔量词)。

因此,您只需要添加-E选项,

find . -name "*.html" -exec sed -E -i '/^main.*\{/,/^\}/d' {} +

{或者,从and中删除逃逸}

find . -name "*.html" -exec sed -i '/^main.*{/,/^}/d' {} +

请参阅此在线演示

当然,如果您只需要在 and 之间只有空格字符时才需要匹配,{请替换为(POSIX BRE)。main{/^main.*{//^main[[:space:]]*{/


推荐阅读