
sedを使用して、指定されたファイルの各行で最後の文字のN番目の項目を置き換える方法は?
;
この場合、最後から3番目を次に変更したいと思います。,
入力する
1;2;3;4;5;6;7;8;9
10;20;30;40;50;60;70;80;90
100;200;300;400;500;600;700;800;900
期待される出力
1;2;3;4;5;6,7;8;9
10;20;30;40;50;60,70;80;90
100;200;300;400;500;600,700;800;900
6番目のアイテムをこのように変更できることを知っています。
sed 's/;/,/6' input_file.csv > output_file.csv
または最後
sed -r 's/(.*);/\1,/' input_file.csv > output_file.csv
しかし、私の特別なケースでは、わずかなニュアンスのために最後から始める必要があります。
私は次のことを試しました
sed -r 's/(.*);/\1,/3' input_file.csv > output_file.csv
答え1
単に行を反転し、N番目の発生位置を変更してから、反転することができます。
rev file | sed 's/;/,/3' | rev
答え2
区別された他の2つのフィールドを明示的にキャプチャできます。
$ sed -r 's/(.*);([^;]*;[^;]*;)/\1,\2/' input_file.csv
1;2;3;4;5;6,7;8;9
10;20;30;40;50;60,70;80;90
100;200;300;400;500;600,700;800;900
またはよりプログラム的に
$ sed -r 's/(.*);(([^;]*;){2})/\1,\2/' input_file.csv
1;2;3;4;5;6,7;8;9
10;20;30;40;50;60,70;80;90
100;200;300;400;500;600,700;800;900
数量子の数字は、下{n-1}
からn番目の数字を置き換えます。
答え3
使用gawk
:
awk -F';' '{print gensub(";", ",", NF-3)}'
組み込みgawk
関数はgensub()
最後からn番目のセミコロンをコンマに置き換えます。
答え4
私たちはGNU sed
できます。
- これ以上処理をスキップするとその行が印刷され、1行にセミコロンが3つ未満の場合は次の行の読み取りに戻ります。
- すべてのセミコロンを改行文字に変更します。
- 3つの改行文字が残るまで、改行文字を1つずつ徐々に復元します。
- 最初の行をコンマに変更し、残りの部分を復元します。
sed -e '
s/;/&/3;T
y/;/\n/
:a;s/\n/&/4;tb
s//,/;y/\n/;/
:b;s//;/;ta
' file
1;2;3;4;5;6,7;8;9
10;20;30;40;50;60,70;80;90
100;200;300;400;500;600,700;800;900
分割を実行しPerl
、分割配列(@ F)にフィールド区切り文字を書き込みます。次に、下から6番目のフィールドは下から3番目のセミコロンで、これをコンマに変更します。変わらず休んでください。
perl -aF'(;)' -plse '
$F[-6]=",",s/.*/@F/ if @F >= 6;
' -- -\"= ./file
POSIX awk を使用して、位置に応じて区切り文字を変更します。
awk -F\; -v n=3 '{ for(i=1; i<=NF; i++) printf "%s%s", $i, (i==NF-n?",":(i==NF?ORS:FS)) }' infile