我需要以下内容:
输入:
NAME-LIST:
name1
<any text>
name_to_be_changed;
NAME-LIST:
name3
<any text>
name_to_be_changed;
输出:替换&#34; name_to_be_changed&#34;按块中的名字
NAME-LIST:
name1
<any text>
name1;
NAME-LIST:
name3
<any text>
name3;
结果:
我更喜欢perl one-liner: - )
答案 0 :(得分:0)
我建议使用类似于Sam发布的搜索表达式:
(NAME-LIST:[\t ]*[\r\n]+)([^\r\n]+)([\r\n]+[^\r\n]*[\r\n]+)name_to_be_changed;
替换字符串为\1\2\3\2;
或$1$2$3$2;
每对开始和结束圆括号指定一个标记组。搜索表达式中有三个这样的标记组。
[\t ]*
可以在块的第一行末尾的固定字符串NAME-LIST:
后面有尾随空格或制表符。
[\r\n]+
匹配1个或多个回车符或换行符。这类似于Sam使用的\v
,但与formfeed等其他垂直空格不匹配。
[^\r\n]+
匹配1个或多个字符,无论是回车还是换行符。如果点的匹配行为被定义为匹配除行终止符之外的所有字符,那就像.
。
[^\r\n]*
匹配0个或更多字符,无论是回车还是换行符。所以<any text>
也可以没有文字,这意味着第三行也可以是一个空行。
标记组中表达式找到的3个字符串分别由\1
,\2
和\3
反向引用$1
,$2
和{{1只有第二个被反向引用两次才能将字符串从第2行复制到第4行,并保持其他3行不变。
答案 1 :(得分:0)
使用perl one-liner
perl -00 -pe 's/NAMELIST:\n(.*)\n.*\n\K.*/$1/' file.txt
切换:
-00
:段落模式-p
:为输入文件中的每一行创建一个while(<>){...; print}
循环。 -e
:告诉perl
在命令行上执行代码。 答案 2 :(得分:0)
首先感谢您的意见......
遗憾的是,我无法使用您建议的两种解决方案,但我找到了自己的解决方案:
perl -00 -pe 's/(NAME-LIST:\s+)(\w+)(.*?)\w+;/$1$2$3$2;/gs'
\s+
= 1个或更多空格(空格,换行符,制表符,...)
\w+
= 1个或更多个字母数字(如字或数字
重要的是/gs
g
= global(多次替换,否则只替换名字)
s
=视为单行