regex - 我找不到将删除开始行和结束行包含大括号的一组行的正则表达式
问题描述
我有许多文件,其中的行以 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
解决方案
该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:]]*{/
推荐阅读
- python - 限制命令的问题,discord.py
- jquery - 如何将变量添加到已经连接的选择器?
- java - 我们可以在 Java/Spring 应用程序中使用用 Scala 编写的域模型吗?
- python - Firefox 中的 Selenium“请验证您是人类”弹出窗口
- python - 如何直接从cmd打开Jupyter而不是复制链接
- java - 应用程序启动方法中的异常 java.lang.reflect.InvocationTargetException 和更多 JavaFx 错误
- google-cloud-platform - 在 BigQuery 中使用 UDF 时是否可以在窗口之间保持共享状态?
- sql-server - 返回除一列中具有重复 ID 的行之外的所有列
- sql - SQL如何不显示同一列中具有更高值的同名行
- python - 为什么 AudioSegment 输出不完整的音频文件?