在 first/second/third/... 匹配之前替换接下来的 N 行,包括匹配

Replace next N lines before a first/second/third/... match including the match

我只想评论第一场比赛的接下来的 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,这是我得到的两个最接近的选项。

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$”

的下 14 行
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',你们的回答为我开辟了道路,我不想复制粘贴,但你们给了我很好的模式可以遵循,你们太棒了!

这可能适合您 (GNU sed):

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

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

这是一个 BSD sed 版本 (comment.sed):

/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