Удалить пробелы перед определенными символами

Удалить пробелы перед определенными символами

Я пытаюсь удалить пробелы из текста следующим образом:

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'

Сработало ,, но с точками или новой строкой все еще проблема. Заменяет и то, и другое ., а не оба вместе.

(Я использую Linux.)

решение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

Обратите внимание, что в регулярном выражении .это подстановочный знак: он соответствует чему угодно. Таким образом, .соответствует пробелу, за которым следуетлюбойсимвол. Эти два символа заменяются .(потому что заменяющая сторона -нетрегулярное выражение, the .— буквальная точка). Это не то, на что вы надеялись.

Связанный контент