예를 들어 다음과 같은 scv 파일이 있습니다.
a1, b1, c1, d1
a2, b2, c2, d2
a3, b3, c3, d3
내가 하고 싶은 것은 첫 번째 쉼표를 ,
세미콜론으로 바꾸는 것입니다 ;
. 첫 번째 쉼표의 위치는 가변적일 수 있습니다( a
줄에서 길이 n
가 m
다를 수 있음). 마지막으로 내 파일은 다음과 같습니다
a1; b1, c1, d1
a2; b2, c2, d2
a3; b3, c3, d3
다른 쉼표는 유지해야 합니다. 누군가 나에게 가장 간단한 해결책을 말해 줄 수 있습니까?
PS 내 솔루션이 작동하지 않습니다.sed '/s/,/;/g' file.csv
답변1
가운데 g
:
sed 's/,/;/g'
이다세계적인, 즉 모든 항목을 ,
로 바꿉니다 ;
.
한 줄에 하나만 교체하려면 다음을 생략하십시오 g
.
sed 's/,/;/'
완전성을 위해:
교체할 발생 횟수를 지정할 수도 있습니다. 예를 들어 두 번째 항목만 바꾸려면 다음을 수행합니다.
sed 's/,/;/2'
GNU를 사용하면 sed
두 번째부터 시작하는 모든 항목(사실 첫 번째 항목을 제외한 모든 항목)을 다음으로 바꿀 수도 있습니다.
sed 's/,/;/2g'
이 예에서는 두 가지 대체를 수행하려면 다음을 수행합니다.
sed 's/,/;/;s/,/;/'
,
replacement 와 같이 패턴이 교체(또는 그 일부)와 일치할 수 있는 경우 상황은 더욱 복잡해집니다 <,>
. sed
이 문제를 해결하기 위한 기본 제공 메커니즘은 없습니다. perl
이 경우 다음을 대신 사용할 수 있습니다.
perl -pe '$i = 0; s/,/$i++ < 2 ? "<,>" : $&/ge'
perl -pe
perl
의 패턴 은 다음과 같습니다 sed
(정규식 구문이 다르다는 점에 유의하세요). 연산자 e
플래그를 사용하면 s///
대체 항목이 코드로 간주됩니다. 여기서는 ,
증분 카운터 < 2인 경우에만 으로 대체합니다. 그렇지 않으면 자체적으로 바꿉니다(실제로 명령에서와 같이 일치하는 문자열을 참조함).<,>
,
$&
&
sed
s
이를 일련의 대체 또는 대체 세트로 일반화할 수 있습니다. 숫자 3 ~ 5 , 7 ~ 9 와 같습니다 .
perl -pe '$i = 0; s/,/$i++;
$i >=3 && $i <= 5 || $i >= 7 && $i <= 9 ? "<,>" : $&/ge'
첫 번째 항목만 바꾸기입력 내내(대모든 라인에서):
sed -e 's/,/;/;t done' -e b -e :done -e 'n;b done'
즉, 첫 번째 대체가 성공한 후 입력의 나머지 부분만 인쇄하는 루프를 입력합니다.
GNU를 사용하면 sed
다음을 사용할 수 있습니다.의사 주소 0:
sed '0,/,/s//;/'
노트
오타인 것 같지만,
sed '/s/,/;/g'
귀하의 질문에 작성한 명령은 완전히 다릅니다.
하고 있는 일:
sed '/start/,/end/g'
where start
is s
및 end
is 입니다 ;
. 즉, g
파일의 포함된 부분 s
과 다음으로 포함된 ;
.
답변2
순수한세게 때리다해결책
while IFS=\, read -r a b ; do echo "$a;$b" ; done <file.csv
아니면 그냥 재미로
paste -d\; <(cut -d, -f1 file.csv) <(cut -d, -f1 --complement file.csv)