bash perl options for an expression, others for another, in the same command

问题描述 投票:0回答:1

我有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”记录分隔符仅应用于最后一行,就会发生这种情况两个表情

如何让它只适用于最后一个?

bash perl delimiter
1个回答
0
投票

由于 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
选项之间放置选项是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.