각 줄의 맨 아래에서 n번째 나타나는 문자열을 바꿉니다.

각 줄의 맨 아래에서 n번째 나타나는 문자열을 바꿉니다.

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

여섯 번째 항목을 이렇게 바꿀 수 있다는 것을 알고 있습니다.

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

구분된 다른 두 필드를 명시적으로 캡처할 수 있습니다.

$ 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할 수있어.

  • 더 이상 처리를 건너뛰면 해당 행이 인쇄되고, 한 행에 세미콜론이 3개 미만이면 다음 행 읽기로 돌아갑니다.
  • 모든 세미콜론을 개행 문자로 변경하세요.
  • 3개의 개행 문자가 남을 때까지 개행 문자를 하나씩 점차적으로 복원합니다.
  • 이제 첫 번째 줄을 쉼표로 변경하고 나머지는 복원하세요.
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)에 필드 구분 기호를 기록합니다. 그런 다음 아래쪽에서 여섯 번째 필드는 아래쪽에서 세 번째 세미콜론이며 이를 쉼표로 변경합니다. 변함없이 쉬세요.

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

관련 정보