我的输入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
如何强制此行为按预期工作?
答案 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>
这也有一点点可读性的好处。