0

私の入力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

この動作を期待どおりに動作させるにはどうすればよいですか?

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 シェルでは、引用符なし\xは と同じように扱われ、同じxことを実行しています

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

実行することでこれをテストできます

echo s/\x1a//g

シェルに何が渡されるかを確認します。あなたも試すことができます

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

制御文字が実際に入力から削除されているかどうかを確認します。

正しいことは、1 行のスクリプトを一重引用符で囲むことです。

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

私が最終的にやったのは(暴徒の解決策も機能することがわかりましたが)、入力する代わりに、\x1aI press and hold Ctrl、次にv, z

これには、もう少し読みやすいという利点もあります。

于 2012-12-04T12:54:06.810 に答える