数値を含む文字列を見つけて、数値を含む別の文字列に置き換える方法

数値を含む文字列を見つけて、数値を含む別の文字列に置き換える方法

たとえば、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されました)。-ised

perl -Mopen='encoding(UTF-16)' -i -pe '
  s{<bestAddressLine4></bestAddressLine4>}{<bestAddressLine4/>}g' file.txt

関連情報