0

我的输入foo.txt是这样的:

Grull^Zn Hernand^Zz   

其中 ^Z 解析为控制字符\x1aod -x在文件上验证)

当我运行以下 Perl 命令时:

perl -pe s/\x1a//g foo.txt

我得到输出:Grulln Hernandz

正如预期的那样。但是,当我将其重定向到文件时

perl -pe s/\x1a//g foo.txt > out.txt

这些文件是相同的,由

diff -c out.txt foo.txt
No differences encountered

如何强制此行为按预期工作?

4

3 回答 3

5

我不知道您如何确定第一个版本有效,但它不适合我。

您需要转义正则表达式中的反斜杠,或者引用它(引用它更常见)。

$ hexdump -C input
00000000  61 62 63 1a 64 65 66 1a  67 68 69 0a              |abc.def.ghi.|
$ perl -pe s/\x1a//g input | hexdump -C
00000000  61 62 63 1a 64 65 66 1a  67 68 69 0a              |abc.def.ghi.|
$ perl -pe s/\\x1a//g input | hexdump -C
00000000  61 62 63 64 65 66 67 68  69 0a                    |abcdefghi.|
$ perl -pe 's/\x1a//g' input | hexdump -C
00000000  61 62 63 64 65 66 67 68  69 0a                    |abcdefghi.|
于 2012-12-03T16:29:33.320 回答
4

我不认为

perl -pe s/\x1a//g foo.txt

做你认为它做的事。在任何理智的 solaris shell 中,未引用\x的被视为与 相同x,并且您正在运行与

perl -pe s/x1a//g foo.txt

您可以通过执行来测试它

echo s/\x1a//g

并查看传递给外壳的内容。你也可以试试

perl -pe s/\x1a//g foo.txt | od -c

查看是否真的从您的输入中删除了控制字符。

正确的做法是将单行脚本括在单引号中:

perl -pe 's/\x1a//g' foo.txt > out.txt
于 2012-12-03T16:30:59.597 回答
0

我最终最终做的(尽管我发现 mob 的解决方案也有效)不是输入,而是\x1a按住Ctrl,然后v, z

这也有利于更具可读性。

于 2012-12-04T12:54:06.810 回答