Добавьте пробелы после знаков препинания с помощью sed - PullRequest
0 голосов
/ 02 июня 2018

Мне нужно использовать заглавные буквы в текстовом файле, но я обнаружил некоторые проблемы при попытке добавить пробел после любого знака препинания с помощью sed.Например: «Hello, World» -> to «Hello, World»

Я попробовал следующее:

#!/bin/bash
if [ $# != 1 ]; then
  echo "No parameter"
  exit
fi

cp $1 $1.bak
ARCH1=/tmp/`basename $1`.$$

sed 's/[A-Z]*/\L&/g' $1 > $ARCH1 
sed -i 's/^./\u&/' $ARCH1

sed 's/  */\ /g' $ARCH1 #Here I replace >= 2 spaces for 1
sed 's/, */, /g' $ARCH1

#These 2 lines don't work well
sed 's/. */. /g' $ARCH1
sed 's/; */; /g' $ARCH1

mv $ARCH1 $1

Сценарий не завершается с ошибкой, но вывод не тотчто я ожидаю.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Использование GNU sed:

$ echo "foo;BAR,BaZ.qux" | sed -r 's/[[:punct:]]+/& /g; s/[[:alnum:]]+/\L\u&/g'
Foo; Bar, Baz. Qux

\L строчными буквами целиком слово, затем \u прописными буквами первого символа.

Смотрите вашу regex(7) справочную страницу для регулярногодокументация по выражению.

0 голосов
/ 02 июня 2018

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

Обратите внимание, что это очень простой подход,Если ваш текст, например, содержит эллипсы (...), он сразу же вальсирует и превращает ... в . . ., и аналогичные предостережения применяются для ?! и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...