在 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
我只想评论第一场比赛的接下来的 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