各行の下部にn番目の文字列を置き換えます。

各行の下部にn番目の文字列を置き換えます。

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

関連情報