我试图仅对第一个匹配中的接下来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
到}
的行,在它们之前插入//
,然后读取文件的其余部分。