在第一/第二/第三/.之前替换下N行火柴包括火柴



我试图仅对第一个匹配中的接下来14行进行评论。

这是要编辑的文本:

...
Text
{
id: userNameText
text: userName
color: ( hoverEnabled && hover ? colors.textHover : colors.text )

font: fonts.listItemMed
elide: Text.ElideRight
x: itemRoot.height + 12
y: 0
width: itemRoot.width - itemRoot.height - 26
}
Text
{
id: userLoginText
text: userLogin
color: ( hoverEnabled && hover ? (userName == "" ? colors.textHover : colors.textDimmedHover ) : (userName == "" ? colors.text : colors.textDimmed ) )
y: userName == "" ? 7 : userNameText.height * 0.8
font: userName == "" ? fonts.listItemBig : fonts.listItemSub
x: itemRoot.height + 12
elide: Text.ElideRight
width: itemRoot.width - itemRoot.height - 26
}
}

我正在使用sed,这是我得到的2个最接近的选项。

sed -e '/^    Text$/ {s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////; n; s/^////;}'

^ ^ ^

<^ Text$"
sed -e '0,/^    Text$/ {s/^    Text$///    Text/}'

^ ^ ^这只注释了第一个匹配,如果我用"!"我可以注释文件的其余部分,但不是这个想法😅

预期输出为:

...
//    Text
//    {
//        id: userNameText
//        text: userName
//        color: ( hoverEnabled && hover ? colors.textHover : colors.text )
//    
//        font: fonts.listItemMed
//
//        elide: Text.ElideRight
//
//        x: itemRoot.height + 12
//        y: 0
//
//        width: itemRoot.width - itemRoot.height - 26
//    }
Text
{
id: userLoginText
text: userLogin
color: ( hoverEnabled && hover ? (userName == "" ? colors.textHover : colors.textDimmedHover ) : (userName == "" ? colors.text : colors.textDimmed ) )
y: userName == "" ? 7 : userNameText.height * 0.8
font: userName == "" ? fonts.listItemBig : fonts.listItemSub
x: itemRoot.height + 12
elide: Text.ElideRight
width: itemRoot.width - itemRoot.height - 26
}
}

任何方法来实现这一点,而不插入确切的行是受欢迎的!


非常感谢'potong'和'Cole Tierney',你们的回答为我指明了道路,我不想复制粘贴,但你们给了我很好的模式,你们太棒了!

这是一个基于BSD的版本:

/Text/, /}/ {
s|^|//|
/}/ {
:idle
n
b idle
}
}

第一行/Text/, /}/是一个正则表达式地址范围。该范围内的每一行(包括)都将被注释掉。在这个范围的末尾,第二个/}/,我们循环回到idle标签,消耗文件的其余部分。否则,地址范围也会注释掉第二个Text块。

单行版本:

sed '/Text/, /}/ {s|^|//|; /}/ {:idle; n; b idle}}' input

测试:

diff expect <(sed -f comment.sed input) && echo ok

这可能适合您(GNU sed):

sed '/^s*Text/{:a;N;/^(s*).*n1*}$/!ba;s/.*/// &/mg;:b;n;bb}' file

收集从Text}的行,在它们之前插入//,然后读取文件的其余部分。

最新更新