我试图匹配一个多行模式,并修改与此模式匹配的每一行,包括第一个,以便在行的开头添加一个字符(+/-)
例如,我有:
stuff above
<span>one-liner span</span>
stuff middle
<span>stuff inside
other stuff
</span>
stuff below我想得到的是:
stuff above
+ <span>one-liner span</span>
stuff middle
+ <span>stuff inside
+ other stuff
+ </span>
stuff below到目前为止我还在那里:
perl -n0e 's/\n(.*<span style="color: green".*?<\/span>)/+$1/g && print' myfile.html这里的问题是,它只修改第一行,如果它是一个多行模式,我想修改所有的行。
有什么办法吗?
我正在使用perl,但如果您认为它更好的话,我可以使用其他工具。
谢谢!
发布于 2019-04-02 19:49:31
一种方法是使用距离算子
perl -wpe'print "+ " if /^\s*<span/ .. /<\/span>/' file此使用中的..运算符保持其状态,以便
一旦左操作数为真,范围运算符将保持为真,直到右操作数为真为止,之后,范围运算符再次变为false。
它的典型用途是精确地选择由给定条件分隔的行范围。
在这里,我将开始的span限制为其行上的第一个非空白的东西,而不是关闭的,以便允许一行<span ...>word</span>部分工作。
发布于 2019-04-02 20:20:29
使用范围运算符遮住所需的范围,然后将其附加到以空白开始的行中。这段代码并没有给出你想要的东西,但是会给你指明正确的方向。
while(<>) {
if( /stuff above/ .. /stuff below/ ){
$_= "+".$_ if /^ +/;
print $_;
}
}距离操作员是我的最爱之一!
发布于 2019-04-10 07:50:25
如果你的数据在'd‘文件中
perl -ne 'if (/^\s*<(span)>.*?(<\/\1>)?\s*$/) {print "+$&";next if ($2);$t="</$1>";do{$_=<>;print "+$_"} until(/$t/) } else {print}' dsed -E 's/<(span)>.*<\/\1>/+&/;Tc;b ;:c /^\s*<span>/{s/^/+/;:l n;s/^/+/;/<\/span>/!bl}' dhttps://stackoverflow.com/questions/55482351
复制相似问题