Perl搜索和替换:替换行尾也替换开始行

时间:2019-05-10 09:01:36

标签: regex perl

我有一个包含以下数据的文件[data.txt]

a,b,c,d,e
e,f,g,h,i
j,k,l,m,n

我使用以下perl命令用某些文本替换行尾。

perl -pi -e 's/$/ X/g' data.txt

但是,我的文件反映了以下内容(它也替换了行的开头)

a,b,c,d,e X
 Xe,f,g,h,i X
 Xj,k,l,m,n X

这是出乎意料的,如果我缺少任何明显的东西,谁能指出?

欢呼 索拉比

3 个答案:

答案 0 :(得分:2)

您还可以将其重写为:

perl -i -ple '$_ .= " X"' data.txt

在这种情况下更易于阅读。我认为。 -l选项首先从每行中删除\n,然后在之后添加(紧接在-p之前),因此您基本上不必考虑\n

答案 1 :(得分:2)

当不使用/m时,$等效于(?=\n\z)|\z

如您所见,它可以在两个不同的位置进行匹配。例如,在下面,它可以在位置9((?=\n\z))和位置10(\z)处匹配。

01234567890   <- positions
a,b,c,d,e␊

解决方案:删除/g,使其仅与两者中的第一个匹配。

perl -pe's/$/ X/'

解决方案:删除换行符,并在字符串末尾进行匹配。

perl -ple's/\z/ X/'    # «$» would work as well as «\z», but I like to say what I mean.

解决方案:删除换行符,只需使用串联即可。

perl -ple'$_.=" X"'

答案 2 :(得分:1)

这是一种方法:

perl -pi -e 's/(.+)$/$1X/' data.txt

编辑:根据建议删除了g。另外,删除g后,解决方案可以简化为

perl -pi -e 's/$/X/' data.txt