특정 문자 앞의 공백 제거

특정 문자 앞의 공백 제거

예를 들어 텍스트에서 공백을 제거하려고 합니다.

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

정규식에서는 .와일드카드이므로 무엇이든 일치합니다. 따라서 .공백 뒤에 일치합니다.어느특징. 두 문자는 다음으로 대체됩니다 .(교체 가장자리가아니요리터럴 마침표 .인 정규식). 이것은 당신이 원하는 것이 아닙니다.

관련 정보