Команда Sed для поиска строк, в которых все слова начинаются с заглавной буквы - PullRequest
0 голосов
/ 04 ноября 2018

Я изучаю команду sed . Я написал команду, которая заменяет первую букву слова на заглавную:

 sed -e "s/\b\(.\)/\u\1/g"

Но я понятия не имею, как найти строки, в которых все слова начинаются с заглавной буквы.

Например, мой текстовый файл:

Hello world
Hello World
Lorem Ipsum sample

Команда должна вернуть одну строку:

Hello World

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Я бы сделал это путем сопоставления строк, в которых есть хотя бы одно слово, начиная с символа нижнего регистра и удалив их:

sed '/\b[[:lower:]]/d' infile

\b является расширением GNU, поэтому для этого требуется GNU sed.

0 голосов
/ 05 ноября 2018

sed предназначен для выполнения s / old / new / , то есть всего . Для всего остального просто используйте awk для простоты, ясности, надежности, мобильности, производительности и т. Д. *

Посмотрите:

$ cat file
Hello world
Hello World
Lorem Ipsum sample
Lorem ipsum Foo bar And stuff

Строки, где каждое слово начинается с заглавной буквы:

$ awk 'gsub(/(^| )[[:upper:]]/,"&") == NF' file
Hello World

Строки, в которых 2 слова начинаются с заглавной буквы:

$ awk 'gsub(/(^| )[[:upper:]]/,"&") == 2' file
Hello World
Lorem Ipsum sample

Строки, в которых более 1 слова начинаются с заглавной буквы:

$ awk 'gsub(/(^| )[[:upper:]]/,"&") > 1' file
Hello World
Lorem Ipsum sample
Lorem ipsum Foo bar And stuff

Строки, в которых одинаковое количество слов начинается с заглавных букв и строчных:

awk 'gsub(/(^| )[[:upper:]]/,"&") == gsub(/(^| )[[:lower:]]/,"&")' file
Hello world
Lorem ipsum Foo bar And stuff

Попробуйте взять любой сценарий sed, который вы получите в ответ на ваш вопрос, и использовать его для вышеупомянутых (или любых других!) Случаев, если / когда ваши требования изменятся.

Вышеуказанное будет работать с любым awk в любой оболочке на любом компьютере UNIX.

0 голосов
/ 05 ноября 2018

Для чего-то подобного вам необходимо сопоставить всю строку, т.е. ^...$. Это работает для вашего примера:

sed -E '/^ *(([A-Z][^ ]*) +)*[A-Z][^ ]*$/!d'

Объяснение

  • * - разрешить дополнительное пространство в начале строки
  • (([A-Z][^ ]*) +)* - соответствует заглавной букве, за которой следует любое количество непробельных символов, за которыми следует один или несколько пробелов. Вся эта группа может быть произвольно повторена
  • [A-Z][^ ]* * - наконец, строка должна заканчиваться заглавным словом, за которым следует дополнительный пробел
  • !d в конце удаляет все строки, которые не соответствуют регулярному выражению
...