首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换可能的多行模式的每一行的开头。

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

Stack Overflow用户
提问于 2019-04-02 19:38:41
回答 3查看 60关注 0票数 1

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

例如,我有:

代码语言:javascript
复制
stuff above
<span>one-liner span</span>
stuff middle
    <span>stuff inside
    other stuff
    </span>
stuff below

我想得到的是:

代码语言:javascript
复制
stuff above
+ <span>one-liner span</span>
stuff middle
+     <span>stuff inside
+     other stuff
+     </span>
stuff below

到目前为止我还在那里:

代码语言:javascript
复制
perl -n0e 's/\n(.*<span style="color: green".*?<\/span>)/+$1/g && print' myfile.html

这里的问题是,它只修改第一行,如果它是一个多行模式,我想修改所有的行。

有什么办法吗?

我正在使用perl,但如果您认为它更好的话,我可以使用其他工具。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-02 19:49:31

一种方法是使用距离算子

代码语言:javascript
复制
perl -wpe'print "+ " if /^\s*<span/ .. /<\/span>/' file

此使用中的..运算符保持其状态,以便

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

它的典型用途是精确地选择由给定条件分隔的行范围。

在这里,我将开始的span限制为其行上的第一个非空白的东西,而不是关闭的,以便允许一行<span ...>word</span>部分工作。

票数 2
EN

Stack Overflow用户

发布于 2019-04-02 20:20:29

使用范围运算符遮住所需的范围,然后将其附加到以空白开始的行中。这段代码并没有给出你想要的东西,但是会给你指明正确的方向。

代码语言:javascript
复制
while(<>) {
    if( /stuff above/ .. /stuff below/ ){
        $_= "+".$_ if /^ +/;
        print $_;
    }
}

距离操作员是我的最爱之一!

票数 1
EN

Stack Overflow用户

发布于 2019-04-10 07:50:25

如果你的数据在'd‘文件中

代码语言:javascript
复制
perl -ne 'if (/^\s*<(span)>.*?(<\/\1>)?\s*$/) {print "+$&";next if ($2);$t="</$1>";do{$_=<>;print "+$_"} until(/$t/) } else {print}' d
代码语言:javascript
复制
sed -E 's/<(span)>.*<\/\1>/+&/;Tc;b ;:c /^\s*<span>/{s/^/+/;:l n;s/^/+/;/<\/span>/!bl}' d
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55482351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档