この文字列の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/\./,/g
y/./,/
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
簡単に言えば、このコマンドが実行する作業は次のとおりです。
- 元の行を予約済みスペースにコピーします。
- パターン空間から最初と最後のフィールドを削除します。
- パターン空間のすべての点をコンマに変更します(コマンドです
y
)。これで、コンマに変更する必要があるすべての点が変更されました。これで、パターンスペースの中間ビットとスペアスペースの元のデータから行を再組み立てする必要があります。 G;H;x
パターン空間に以下を含めるように(AND)- 生の文字列の後に改行文字が続きます。
- 修正された中間数字の後に改行文字が続きます。
- 元の文字列です。
これで、パターン空間には以下が含まれます。3行。最初の行の最初のフィールドと改行文字を除くすべての項目を削除し、削除されたビットを
;
。最後の行と同様の操作を行います。つまり、(現在の一意の)改行文字と最後の行の前のすべての項目を削除して
;
に置き換えます;
。完璧。
または、単にawk
コードを使用することができます。