8

さまざまな文字を一重引用符または二重引用符で置き換えようとしています。

これが私のテストファイルです:

# Replace all with double quotes
" fullwidth
“ left
” right
„ low
" normal

# Replace all with single quotes
' normal
‘ left
’ right
‚ low
‛ reverse
` backtick

私はこれをやろうとしています...

perl -Mutf8 -pi -e "s/[\x{2018}\x{201A}\x{201B}\x{FF07}\x{2019}\x{60}]/'/ug" test.txt
perl -Mutf8 -pi -e 's/[\x{FF02}\x{201C}\x{201D}\x{201E}]/"/ug' text.txt

ただし、適切に置き換えられるのはバッククォート文字のみです。他のコードポイントが大きすぎることと関係があると思いますが、これに関するドキュメントは見つかりません。

ここに、Unicodeコードポイントをダンプするワンライナーがあり、それらが正規表現と一致することを確認します。

$ awk -F\  '{print $1}' test.txt | \
    perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'

U+FF02 "
U+201C “
U+201D ”
U+201E „
U+0022 "

U+0027 '
U+2018 ‘
U+2019 ’
U+201A ‚
U+201B ‛
U+0060 `

正規表現が一致しないのはなぜですか?

4

2 に答える 2

22

-CSAD Perlの呼び出しを忘れており$PERL_UNICODE、環境に設定されていないため、一致していません。-Mutf8あなたはあなたのソースコードがそのエンコーディングにあることを発表すると言っただけです。これはI/Oには影響しません。

必要なもの:

$ perl -CSAD -pi.orig -e "s/[\x{2018}\x{201A}\x{201B}\x{FF07}\x{2019}\x{60}]/'/g" test.txt

私はこの答えの中でこの種のことを数回言及します。

于 2012-10-01T20:49:19.560 に答える
8

を使用use utf8;して、ソースコードがUTF-8であることをPerlに伝えました。ソースコードをASCIIに制限しているので、これは役に立ちません(無害ですが)。

を使用/uして、Perlに、、、のUnicode定義を使用するように指示し\sまし\d\w。これらのパターンを使用しないため、これは役に立ちません(ただし無害です)。

入力をデコードしなかったため、入力はバイトのみで構成されているため、クラス内のほとんどの文字(たとえば\x{2018})はおそらく何にも一致しません。入力をデコードする必要があります(もちろん、出力をエンコードします)。を使用-CSDすると、これが行われる可能性があります。

perl -CSD -i -pe'
   s/[\x{2018}\x{201A}\x{201B}\x{FF07}\x{2019}\x{60}]/\x27/g;
   s/[\x{FF02}\x{201C}\x{201D}\x{201E}]/"/g;
' text.txt
于 2012-10-01T20:57:42.380 に答える