たとえば、xmlタグがあります<bestAddressLine4></bestAddressLine4>
。<bestAddressLine4 />
以下のコマンドを使用していますが、動作しません。
sed -i 's/<bestAddressLine4><\/bestAddressLine4>/<bestAddressLine4\/>/g' file.txt
しかし、うまくいきません。
正しいコマンドを提案してください。
ご協力ありがとうございます。
答え1
@bxmが正しい方向に向かっていると思います。
sed
実装が非標準拡張をサポートしている場合、このコマンドは-i
ユーザーのロケール文字エンコーディングに従ってエンコードされた入力で期待どおりに機能する必要があります(出力を参照locale charmap
)。
これらの文字はすべて移植可能な文字セットに属するため、行の残りの部分にも移植可能な文字セットの文字のみが含まれている限り、システム内のすべてのロケールでも機能します。
しかし、1つの可能性は、ファイルがBOM、UTF-16LE、UTF-16BE、UTF-32 / UCS-4を使用してUTF-16にエンコードされ、POSIX APIと互換性がなく、どのロケール文字マップでも使用できないことです。 )バイト0の文字を含むエンコーディングが多いからです。
これを処理するには、その形式のテキストをデコードできるツールや言語を使用するか、システムでサポートされている中間エンコーディング(通常はUnixシリーズシステムで最も一般的なUnicodeエンコーディングであるUTF-8)に変換する必要があります。 。
file file.txt
どのエンコーディングで書かれたかを教えてください。
UTF-16(ほとんど)の場合は、次のことができます。
< file.txt iconv -f UTF-16 |
sed 's|<bestAddressLine4></bestAddressLine4>|<bestAddressLine4/>|g' |
iconv -t UTF-16 > new-file.txt
または、次のものを使用できます(一部の実装が借用perl
されました)。-i
sed
perl -Mopen='encoding(UTF-16)' -i -pe '
s{<bestAddressLine4></bestAddressLine4>}{<bestAddressLine4/>}g' file.txt