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