我有一个包含以下数据的文件[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
这是出乎意料的,如果我缺少任何明显的东西,谁能指出?
欢呼 索拉比
答案 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