
다음과 같은 텍스트에서 공백을 제거하려고 합니다.
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
정규식에서 .
와일드카드는 무엇이든 일치합니다. 따라서 .
공백 다음에 일치합니다.어느성격. 이 두 문자는 다음으로 대체됩니다 .
(대체 측면이~ 아니다정규식은 .
문자 그대로의 마침표입니다). 이것은 당신이 바라던 것이 아닙니다.