Debian

替換每行中第 n 個出現的字元串

  • June 25, 2021

使用 sed,如何將給定文件的每一行上第 N 個字元替換為最後一個字元?

在這種情況下,我想將第三個替換為最後;一個,

輸入

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

您可以顯式擷取另外兩個分隔欄位:

$ 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 個。

您可以簡單地反轉線條,更改第 N 次出現,然後重新反轉:

rev file | sed 's/;/,/3' | rev

引用自:https://unix.stackexchange.com/questions/655551