替换可能的多线模式的每一行的开头

问题描述 投票:1回答:3

我正在尝试匹配多线模式并修改匹配此模式的每一行,包括第一个,以便在行的开头添加一个字符(+/-

例如,我有:

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,但如果您认为它更好,我会对其他工具持开放态度。

谢谢 !

perl substitution
3个回答
2
投票

一种方法是使用range operator

perl -wpe'print "+ " if /^\s*<span/ .. /<\/span>/' file

此用途中的..运算符维持其状态,因此

一旦左操作数为真,范围运算符将保持为真,直到右操作数为真,此后范围运算符再次变为假。

它的典型用途是精确选择由给定条件界定的一系列线条。

在这里,我限制开放的spans是其第一个非空白的东西,但不是结束的,所以允许单行<span ...>word</span>部分工作。


1
投票

使用范围运算符屏蔽所需的范围,然后附加到以空格开头的行。此代码并未准确提供您想要的内容,但会指向正确的方向。

while(<>) {
    if( /stuff above/ .. /stuff below/ ){
        $_= "+".$_ if /^ +/;
        print $_;
    }
}

范围操作员是我的最爱之一!


0
投票

如果您的数据在'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
© www.soinside.com 2019 - 2024. All rights reserved.