MATCH1.MATCH2 {
always same MATCH3
}
所有三个MATCH
必须匹配。
输入:
foo.bar {
always same bus
}
1.2 {
always same 3
}
a.b {
always same c
}
i.ii {
always same iii
}
b.2 {
always same c
}
1.2 {
always same b
}
假设我想删除1
,2
和3
MATCH 条目(从名称到右花括号}
)
输出:
foo.bar {
always same bus
}
a.b {
always same c
}
i.ii {
always same iii
}
b.2 {
always same c
}
1.2 {
always same b
}
我尝试过多种方法,sed
但没有一种能让我接近目标:
sed "/$match1\.$match2/{/$match3//d;}" ./input
sed "/^$match1\.$match2 {/,/^always same $match3/d" ./input
# ...
我最纠结的是,有两行需要匹配。我试过在中间添加\n
和 ,.*
但没成功。
以下是我通过仅匹配第一行来删除条目的方法,如果有帮助的话:
sed "/^$match1\.$match2 {/,/^}/d" ./input # no match3
正则表达式
(?s)$match1.$match2 \{[^\{\}]*$match3\n\}\n
评论:
(?s)
使用以下有效标志匹配模式的剩余部分:s
.s
修饰符:单行。点匹配换行符。[^\{\}]
匹配所有非{
和}
字符。sed
如果您不受使用限制
sed
,您可以尝试使用/调整以下 Python3 脚本。Python3脚本
输出
不确定这是否是正确的方法,但我在@continuous-improvement 的帮助下设法做到了:
欢迎提供反馈和更正!
假设 shell 变量
m1
、m2
和m3
设置为有效的正则表达式,sed
表达式会尝试查找与 匹配的行^$m1\.$m1 {$
。找到这样的行后,它会使用 将下一行附加到缓冲区N
。如果缓冲区现在匹配$m3$
(包括变量值前的初始空格),则会从文件中读取另一行,并丢弃缓冲区,从而从输出中省略整个三行部分。另一种方法是始终读取整个三行部分,然后在多行缓冲区中进行单次匹配:
使用任何 awk,无论你的匹配变量等是否
m1
包含正则表达式元字符,因为它只是进行文字字符串比较:我会
perl
用sed
:-p
是针对每个输入记录评估sed
表达式(传递给)的模式。-e
-0<octal>
改变输入记录分隔符,此处777
高于任何可能的字节值,整个输入将被视为一个整体。s{regex}{replacement}flags
和flags
使用m
多行^
匹配$
来匹配主题中每一行的开头和结尾,而不仅仅是主题的开头和结尾,g
以替换所有出现的情况,x
允许正则表达式中的空格使其更易读。replacement
这里是空的regex
有:\h
对于任何水平空格(特别是不包括换行符)。\s
\s
对于任何空格,包括换行符(如果您不想匹配换行符,则可能需要用替换某些s\h
,例如,如果您不想在always
和之间允许换行符same
)\Q$ENV{matchN}\E
在正则表达式中插入相应的环境变量,但\Q
引用(直到第\E
nd 个),因此它被视为固定字符串而不是正则表达式(这对于$matchN
诸如4.5
其中.
是正则表达式运算符的值很重要)这将删除所有
如果您还需要删除:
更改为:
$shell_var
像您那样在代码中嵌入扩展(通过 shell)sed
会引入任意命令执行漏洞,最好避免。它不适用于
perl
上述情况,因为那是$perl_variable
perl 在其正则表达式运算符中的引用,而不是 shell 将 shell 变量扩展为要由 perl 解释的代码。