예를 들어 텍스트에서 공백을 제거하려고 합니다.
Ala ma kota ,psa i kanarka
, chyba . . .
얻기 위해서는
Ala ma kota,psa i kanarka, chyba...
sed
다음 명령을 사용하려고 합니다 .
echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed 's/ ,/,/g' | sed 's/ ././g'
작동 ,
하지만 여전히 점이나 새 선에 문제가 있습니다. 동시에 둘 다 대체하는 것이 아니라 둘 다를 .
대체 합니다 .
(저는 리눅스를 사용하고 있습니다.)
답변1
GNU sed 사용(이 Linux에 태그를 지정했기 때문에 사용하게 되었습니다):
$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
어떻게 작동하나요?
-z
이는 sed가 한 번에 한 줄씩 읽는 대신 모든 텍스트를 한 번에 읽도록 지시합니다.
-E
이는 sed에게 확장된 정규식 구문을 사용하도록 지시합니다. 이렇게 하면 보기 흉한 백슬래시가 필요하지 않습니다.
s/[[:space:]]([,.?!])/\1/g
,
.
이렇게 하면 , 또는 하나?
뒤의 공백이!
구두점으로 만 대체됩니다 .다른 구두점을 포함하려면 대괄호 안에 를 추가하면 됩니다
,.?!
.[[:space:]]
여기에는 공백뿐만 아니라 탭, 줄 바꿈 등도 포함됩니다.
다양성
이 버전에는이상구두점 앞의 공백 문자:
$ echo $'Ala ma kota ,psa i kanarka \n, chyba . . .' | sed -zE 's/[[:space:]]+([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
논의하다
질문은 다음과 같습니다:
s/ ././g
정규식에서는 .
와일드카드이므로 무엇이든 일치합니다. 따라서 .
공백 뒤에 일치합니다.어느특징. 두 문자는 다음으로 대체됩니다 .
(교체 가장자리가아니요리터럴 마침표 .
인 정규식). 이것은 당신이 원하는 것이 아닙니다.