我正在尝试匹配多线模式并修改匹配此模式的每一行,包括第一个,以便在行的开头添加一个字符(+/-
)
例如,我有:
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,但如果您认为它更好,我会对其他工具持开放态度。
谢谢 !
一种方法是使用range operator
perl -wpe'print "+ " if /^\s*<span/ .. /<\/span>/' file
此用途中的..
运算符维持其状态,因此
一旦左操作数为真,范围运算符将保持为真,直到右操作数为真,此后范围运算符再次变为假。
它的典型用途是精确选择由给定条件界定的一系列线条。
在这里,我限制开放的span
s是其第一个非空白的东西,但不是结束的,所以允许单行<span ...>word</span>
部分工作。
使用范围运算符屏蔽所需的范围,然后附加到以空格开头的行。此代码并未准确提供您想要的内容,但会指向正确的方向。
while(<>) {
if( /stuff above/ .. /stuff below/ ){
$_= "+".$_ if /^ +/;
print $_;
}
}
范围操作员是我的最爱之一!
如果您的数据在'd'文件中
perl -ne 'if (/^\s*<(span)>.*?(<\/\1>)?\s*$/) {print "+$&";next if ($2);$t="</$1>";do{$_=<>;print "+$_"} until(/$t/) } else {print}' d
gnu口渴
sed -E 's/<(span)>.*<\/\1>/+&/;Tc;b ;:c /^\s*<span>/{s/^/+/;:l n;s/^/+/;/<\/span>/!bl}' d