
Я пытаюсь удалить пробелы из текста следующим образом:
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 .
— буквальная точка). Это не то, на что вы надеялись.