2012-03-12 4 views
3

いくつかのスクリプトを書いて、sedで検索/置換したり、ファイルをさまざまな文字セットにすることができます。ファイルが破損する可能性はありますか?sed(など)が非ASCIIファイルを壊してしまいますか?

置き換えたいテキストはASCIIで、ASCIIのみを含むファイルの行にも発生しますが、残りの行には他の文字セットの文字が含まれています。

+1

はい(15まで入力してください) – KevinDTimm

+0

申し訳ありません、あなたは精緻化できますか? – user1264579

+0

私の答えはあなたの唯一の質問でした。しかし、他の文字セットも使えるようです。これまでのところあなたは答えをrecv''dしていないので、他の場所で検索することが最善の策だと思われます。 – KevinDTimm

答えて

5

キャラクタセットが改行文字がASCIIと同じで、NUL文字(\0)が発生しないシングルバイトエンコーディング(ISO-8859-nファミリなど)またはUTF-8の場合、あなたの操作はうまくいくでしょう。ファイルがUTF-16を使用する場合、(NULのために)それはできません。単純な検索とASCII文字列の置換には、なぜあなたはエンコーディングがASCIIのスーパーセットであり、このようなシンプルなマッチでは、sedがほとんどバイトレベルで動作し、1バイトシーケンスを別のものに置き換えると仮定します。

しかし、より複雑な操作では、置き換えられた文字列や置換文字列に特殊文字が含まれているように、結果は異なる場合があります。たとえば、コンソールのエンコーディングとロケールがファイルのエンコーディングと異なる場合、コマンドラインで入力したアクセント記号付きの文字がファイルのエンコーディングに合わないことがあります。これを回避することはできますが、注意が必要です。

sedの一部の操作は、ロケールによって異なります。たとえば、英数字と見なされる文字があります。例えばポーランドのUTF-8ロケールでとASCIIを使用してCロケールで行われ、次の代替の比較:

$ echo "gęś gęgała" | LC_ALL=pl_PL.UTF-8 sed -e 's/[[:alnum:]]/X/g' 
XXX XXXXXX 
$ echo "gęś gęgała" | LC_ALL=C sed -e 's/[[:alnum:]]/X/g' 
Xęś XęXXłX 

をしかし、あなたは唯一のリテラル文字列を置換する場合、期待どおりに動作します:

$ echo "gęś gęgała" | LC_ALL=pl_PL.UTF-8 sed -e 's/g/G/g' 
Gęś GęGała 
$ echo "gęś gęgała" | LC_ALL=C sed -e 's/g/G/g' 
Gęś GęGała 

ご覧のように、アクセント付きの文字はロケールによって処理されるため、結果が異なります。簡単に言えば、リテラルASCII文字列の置き換えはおそらくうまくいくでしょう。より複雑な操作は、調べる必要があり、うまく動作しないこともあります。

+0

+100あなたが見知らぬ人を助けるために役立つ説明と努力をしてくれたからです。環境言語/文字セットを変更して各ターゲットファイルに一致させるように見えます。 ###さらに、私の検索/置換は、ASCII文字だけの行のASCII文字にのみ適用されます。文字セットが改行文字を混同する可能性がある場合には、 – user1264579

+0

@ user1264579はい。リテラル文字列を他のリテラル文字列で置き換えるだけであれば、改行がASCIIと同じであれば十分であり、NULは置換えが動作しない場合は表示されません。 ASCII以外の文字はOKです。もちろん、置換がバイト単位で正しい場合であっても、ターゲットのエンコーディングで何を意味するのかを確認する必要があります。 Latin-2を使用するファイルでUTF-8としてエンコードされた 'ę'を正しく置き換えると、'ę'を表す2バイトがUTF-8で正しく挿入されますが、これらのバイトはLatinで表示されたときに迷惑メールとして表示されます-2と残りのファイル。 –

関連する問題