Perl swap命令似乎不适用于输出重定向

时间:2012-12-03 16:24:01

标签: perl unix solaris

我的输入foo.txt就是:

Grull^Zn Hernand^Zz   

^ Z解析为控制字符\x1a(在文件上使用od -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

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

3 个答案:

答案 0 :(得分: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.|

答案 1 :(得分:4)

我不认为

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

做你认为它做的事。在任何理智的solaris shell中,不带引号的\x被视为与x相同,并且您运行的内容与

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

您可以通过执行

进行测试
echo s/\x1a//g

并查看传递给shell的内容。你也可以尝试

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

查看控制字符是否确实已从输入中删除。

正确的做法是将单行脚本用单引号括起来:

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

答案 2 :(得分:0)

我最终做了什么(虽然我发现暴徒的解决方案也有效)但不是输入\x1a而是按住Ctrl,然后v, z < / p>

这也有一点点可读性的好处。