다음과 같은 텍스트 파일이 있습니다.
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
쉼표를 세미콜론으로 바꾸는 방법, 두 번째부터 시작하세요(그리고 마지막 것까지 계속)?
다음 출력을 얻고 싶습니다.
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
답변1
이것을 사용하면 이 작업을 수행할 수 있습니다.
$ sed -e 's/,/;/g' -e 's/;/,/1' infile
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
설명하다
s/,/;/g
다음 항목을 모두 바꿉니다,
.;
s/;/,/1
첫 번째 항목을;
다음으로 바꿉니다.,
GNU가 있다면 sed
간단하고 사용하기 쉬운 다음을 시도해 볼 수도 있습니다.
sed 's/,/;/2g' infile
답변2
입력에 이미 세미콜론이 있을 수 있다면 주의해야 합니다.
$ sed 's/,/\n/g; s/\n/,/; s/\n/;/g' input
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
sed는 입력을 한 줄씩 읽기 때문에 일반 입력에는 개행 문자가 없습니다. 따라서 모든 쉼표를 개행 문자로 바꿀 수 있으며 혼란이 없을 것임을 알고 있습니다. 다음으로 첫 번째 개행 문자를 쉼표로 복원합니다. 마지막으로 나머지 줄 바꿈을 세미콜론으로 바꿉니다.
더 자세하게:
s/,/\n/g
모든 쉼표를 줄 바꿈으로 바꾸십시오.s/\n/,/
첫 번째 개행 문자를 쉼표로 바꿉니다.s/\n/;/g
나머지 줄 바꿈을 세미콜론으로 바꾸십시오.
답변3
사용 awk
:
awk '{gsub(",", ";"); sub(";", ","); print}' file.txt
gsub(",", ";")
모두,
다음으로 교체;
sub(";", ",")
첫 번째 것을;
다음으로 바꾸십시오.,
예:
% cat file.txt
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
% awk '{gsub(",", ";"); sub(";", ","); print}' file.txt
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
답변4
$ cat ip.txt
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
test15
$ perl -F, -ane 'print "$F[0]"; print ",".join(";",@F[1..$#F]) if($#F > 0)' ip.txt
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
test15
다른 방법:
perl -F'/(,)/,$_,2' -ane '$F[2] =~ s/,/;/g; print @F'
/(,)/,$_,2
$_
사용된 방법에 따라,
(입력 라인)을 두 부분으로 나누고(,)
, 구분 기호를 캡처하고 아래 설명된 대로 세 가지 요소를 생성합니다.$F[0]
첫 번째 필드를 가져옵니다. 존재하는 경우 가져옵니다$F[1]
.,
$F[2]
나머지 필드 가져오기(있는 경우)
또 다른 방법이 있어요, 모방sed 's/,/;/2g'
perl -pe '$c=0; s/,/++$c<2 ? $& : ";"/ge' ip.txt
- 각 행에 대한 카운터 초기화
- 교체시 필요에 따라 카운터 값을 확인하십시오.
- 수정자를 사용하면
e
Perl 코드가 대체 섹션에 나타날 수 있습니다.