특정 문자 앞의 공백 제거

특정 문자 앞의 공백 제거

다음과 같은 텍스트에서 공백을 제거하려고 합니다.

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

정규식에서 .와일드카드는 무엇이든 일치합니다. 따라서 .공백 다음에 일치합니다.어느성격. 이 두 문자는 다음으로 대체됩니다 .(대체 측면이~ 아니다정규식은 .문자 그대로의 마침표입니다). 이것은 당신이 바라던 것이 아닙니다.

관련 정보