在多行中替换 - 请参阅替换内容

时间:2014-05-30 14:55:08

标签: regex perl reference multiline

我需要以下内容:

输入:

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: - )

3 个答案:

答案 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 =视为单行