문자의 첫 번째 인스턴스만 바꾸기

문자의 첫 번째 인스턴스만 바꾸기

예를 들어 다음과 같은 scv 파일이 있습니다.

a1, b1, c1, d1
a2, b2, c2, d2
a3, b3, c3, d3

내가 하고 싶은 것은 첫 번째 쉼표를 ,세미콜론으로 바꾸는 것입니다 ;. 첫 번째 쉼표의 위치는 가변적일 수 있습니다( a줄에서 길이 nm다를 수 있음). 마지막으로 내 파일은 다음과 같습니다

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 -peperl의 패턴 은 다음과 같습니다 sed(정규식 구문이 다르다는 점에 유의하세요). 연산자 e플래그를 사용하면 s///대체 항목이 코드로 간주됩니다. 여기서는 ,증분 카운터 < 2인 경우에만 으로 대체합니다. 그렇지 않으면 자체적으로 바꿉니다(실제로 명령에서와 같이 일치하는 문자열을 참조함).<,>,$&&seds

이를 일련의 대체 또는 대체 세트로 일반화할 수 있습니다. 숫자 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 startis sendis 입니다 ;. 즉, 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)

관련 정보