假设我有一个文本文件,text.txt
并且想before.txt
用另一个包含在其中的字符串替换其中包含的(多行)字符串,after.txt
我该怎么做?(我不想使用正则表达式我硬是要替换包含在字符串before.txt
与文本中包含after.txt
的text.txt
。
我希望使用以下建议的方法:https : //unix.stackexchange.com/a/26289/288916
我试过了:
perl -i -p0e 's/`cat before.txt`/`cat after.txt`/se' text.txt
但是,除非我是一个完整的白痴,并且弄乱了一些琐碎的东西,否则我不能简单地将其扩展为从使用cat的文件中加载字符串。
转义可能出了点问题。该文件before.txt
包含诸如的符号/[]"
。
谢谢@ilkkachu,我尝试了:
perl -i -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; s/\Q$b\E/$a/s\' text.txt
,但仍无法正常工作。我通过确保之前的字符串与要替换字符串的整行完全匹配来使它在一个实例中起作用。但是,例如替换在行首找不到的字符串不起作用。示例:text.txt
文件包含:
Here is
some text.
before.txt
包含: text
after.txt
包含: whatever
没有机会。
perl -i -p0e 's/`cat before.txt`/`cat after.txt`/se' text.txt
在这里,您在单引号内有反引号,因此Shell不会处理它们,但是Perl照原样查看它们。再说一次,Perl还支持反引号作为一种报价形式,但是在内部不起作用s///
。
只要您在Perl命令行上使用-0
或-0777
在命令行上使用多行模式就没有问题。(-0
它将用NUL字符分隔行,这是文本文件所没有的,并且-0777
将一次性读取整个文件。)
您可以使用双引号来完成此操作,但这将直接在Perl脚本中扩展文件的内容,并且任何特殊字符都将作为脚本的一部分。单个斜杠将终止s///
操作员并引起问题。
而是让Perl读取文件:
perl -i -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; s/$b/$a/s' text.txt
在此,的内容before.txt
仍将视为正则表达式。如果要停止该操作,请s/\Q$b\E/$a/s
改用。
我不认为您也不想使用该e
标志s///
,它将使替换作为Perl表达式使用(这仅在您具有将Shell扩展文件内容到Perl命令行的情况下才有意义)。
在后面的示例中,您具有some text.\n
intext.txt
和text\n
in before.txt
,其中\n
和往常一样代表换行符。将文件加载到Perl中后,它们将保持原样,因此最后的换行before.txt
计数。另一个文件在换行符之前有一个点,另一个文件则没有,因此它们不匹配。
您可以使用以下命令删除可能的尾随换行符chomp $b;
加载文件后, 您可以删除可能的尾随换行符 。 $b =~ s/\n$//;
:
$ perl -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; $b =~ s/\n$//; $a =~ s/\n$//; s/$b/$a/s' text.txt
Here is
some whatever.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句