Я считаю, что причина, по которой ваш скрипт не работает, в том, что вы забыли передать -i
в sed в нескольких вызовах, а также в том, что вы не экранировали .
в регулярном выражении, так что .
соответствует любомусимвол.
Я также считаю, что более простой способ сделать то, что вы пытаетесь сделать, это
sed -i.bak 's/[A-Z]*/\L&/g; s/\([.,;]\) */\1 /' "$1"
-i.bak
, который редактирует файл на месте и создает резервную копию с помощью .bak
расширение, и сценарий просто
s/[A-Z]*/\L&/g # lower-case everything (I got that from your code)
s/\([.,;]\) */\1 / # replace spaces after period, comma or semicolon
Здесь
[.,;]
- это период совпадения набора символов, запятая или точка с запятой, \(stuff\)
захватывает stuff
в группе для последующего использования, а \1
является обратной ссылкой, относящейся к первому такому захвату.
Обратите внимание, что это очень простой подход,Если ваш текст, например, содержит эллипсы (...), он сразу же вальсирует и превращает ...
в . . .
, и аналогичные предостережения применяются для ?!
и т. Д.