我有file1.txt
text1
text1
text1
text2
text2
text2
text1
text1
text1
和 file2.txt
text1
text2
text2
text1
text1
text1
我有一个管道命令:
perl -pe 's/text2$/text4/' file1.txt file2.txt | perl -0pe 's/text1$/text3/'
这给了我输出:
text1
text1
text1
text4
text4
text4
text1
text1
text1 #EOF file1.txt
text1
text4
text4
text1
text1
text3 #EOF file2.txt
但我想要:
text1
text1
text1
text4
text4
text4
text1
text1
text3 #EOF file1.txt
text1
text4
text4
text1
text1
text3 #EOF file2.txt
所以我尝试了这个命令:
perl -pe 's/text2$/text4/; ' -0e 's/text1$/text3/' file1.txt file2.txt
意外地将“空”记录定界符应用于两个表达式而不仅仅是最后一个,导致:
text1
text1
text1
text2
text2
text2
text1
text1
text3 #EOF file1.txt
text1
text2
text2
text1
text1
text3 #EOF file2.txt
事实上,如您所见,“text2”从未在最后一行找到,因此它没有被“text4”替换,如果“null”记录分隔符仅应用于最后一行,就会发生这种情况两个表情
如何让它只适用于最后一个?
由于 slurping 将每个文件视为一行,因此您可以通过更改管道中程序的顺序来解决此问题。
perl -0777pe's/text1$/text3/' file1.txt file2.txt | perl -pe's/text2$/text4/'
上述解决方案非常依赖于您给出的示例的细节。以下是通用解决方案:
for f in file1.txt file2.txt; do
perl -pe's/text2$/text4/' -- "$f" | perl -0777pe's/text1$/text3/'
done
通过一些代码更改,我们可以想出更好的解决方案。
perl -0777pe's/text2$/text4/mg; s/text1$/text3/;' file1.txt file2.txt
关于您尝试的说明
多个
-e
选项与换行符连接。
$ perl -e'print "Hello,' -e'World\n"'
Hello,
World
因此,在
-e
选项之间放置选项是没有意义的。