sedで4回交換

sedで4回交換

この文字列の2番目、3番目、4番目、5番目の点を変更したいと思います。

2019-03-17T11:32:28.143343Z;1234.5678;901.234;567.89012;3456.78;192.168.0.1

カンマを使用すると、次のような結果が得られます。

2019-03-17T11:32:28.143343Z;1234,5678;901,234;567,89012;3456,78;192.168.0.1

最初のカンマと6番目のカンマ(およびそれ以降のすべてのカンマ)は変更されていないままにしてください。

私は何度も実行できる次のコマンドを見つけました(しかしベストプラクティスではないかもしれません)。

echo "$tmp" | sed 's/\./\,/2'

1つのコマンドでこれをどのように実行できますか?

ベストアンサー1

データは;6つの区切りフィールドで構成されており、フィールド2〜5(1または6ではない)の点をカンマで置き換えようとします。

これは最も簡単な方法ですawk

awk -F ';' 'BEGIN { OFS=FS } { for (i=2; i<=5; ++i) gsub("\\.", ",", $i); print }' file

与えられたサンプルデータに基づいて、次のようになります。

2019-03-17T11:32:28.143343Z;1234,5678;901,234;567,89012;3456,78;192.168.0.1

コードは単に;各入力行の - で区切られたフィールドを繰り返し、ループが繰り返す個々のフィールドに対してグローバル検索と置換を呼び出します(またはでgsub()実行するように)。s/\./,/gy/./,/sed

次に、修正された行を印刷します。

この-Fオプションは入力フィールド区切り文字をセミコロンに設定し、そのBEGINブロックを使用して出力フィールド区切り文字も同じ値に設定します(そうでない場合はスペースで区切られたフィールドが表示されます)。


を使用すると、sed次のことができます。

sed 's/\./,/2; s/\./,/2; s/\./,/2; s/\./,/2' file

つまり、2番目の点を4回交換します。 2番目の点は交換するたびに置き換えられます。ただし、これは各フィールド内の値の数が固定されていると仮定します。

この問題を解決するには、フィールドに複数のドットで区切られたコンテンツがある場合は、次のようにします。

sed 'h; s/^[^;]*;//; s/;[^;]*$//; y/./,/; G;H;x; s/;[^\n]*\n/;/; s/\n.*;/;/' file

簡単に言えば、このコマンドが実行する作業は次のとおりです。

  1. 元の行を予約済みスペースにコピーします。
  2. パターン空間から最初と最後のフィールドを削除します。
  3. パターン空間のすべての点をコンマに変更します(コマンドですy)。これで、コンマに変更する必要があるすべての点が変更されました。これで、パターンスペースの中間ビットとスペアスペースの元のデータから行を再組み立てする必要があります。
  4. G;H;xパターン空間に以下を含めるように(AND)

    1. 生の文字列の後に改行文字が続きます。
    2. 修正された中間数字の後に改行文字が続きます。
    3. 元の文字列です。
  5. これで、パターン空間には以下が含まれます。3行。最初の行の最初のフィールドと改行文字を除くすべての項目を削除し、削除されたビットを;

  6. 最後の行と同様の操作を行います。つまり、(現在の一意の)改行文字と最後の行の前のすべての項目を削除して;に置き換えます;

  7. 完璧。

または、単にawkコードを使用することができます。

おすすめ記事