Первая буква слов в верхнем регистре с использованием SED - PullRequest
37 голосов
/ 08 октября 2009

Как заменить первую букву слова на заглавную, например,

Trouble me
Gold rush brides

в

Trouble Me
Gold Rush Brides

Ответы [ 9 ]

63 голосов
/ 08 октября 2009

Эта строка должна сделать это:

sed -e "s/\b\(.\)/\u\1/g"
21 голосов
/ 09 октября 2009

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

awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }}1' file

Вывод будет:

Trouble Me
Gold Rush Brides
12 голосов
/ 16 марта 2010

Используйте следующую команду sed для заглавных букв первой буквы каждого слова.

echo -e "Trouble me \nGold rush brides" | sed -r 's/\<./\U&/g'

выход

Trouble Me
Gold Rush Brides

Переключатель -r указывает sed использовать расширенные регулярные выражения. В инструкции к sed затем укажите « s earch и замените» (s в начале) шаблон \<. на шаблон \U& g в общем, то есть все экземпляры в каждой строке (это модификатор g в конце). Шаблон, который мы ищем, это \<., который ищет границу слова (\<), за которой следует любой символ (.). Шаблон замены - \U&, где \U указывает sed на сделать следующий текст в верхнем регистре , а & является синонимом \0, что означает " все, что было подобрано ". В данном случае «все, что было сопоставлено» - это то, с чем . совпало, поскольку границы слов не включены в совпадения (вместо этого они являются якорями ). То, что соответствует ., это всего лишь один символ, так что это верхний регистр.

4 голосов
/ 11 января 2018

Я знаю, что вы сказали sed, но для сценариев оболочки одним из самых простых и гибких вариантов для меня было использование Python, доступного в большинстве систем:

$ echo "HELLO WORLD" | python3 -c "import sys; print(sys.stdin.read().title())"
Hello World

Например:

$ lorem | python3 -c "import sys; print(sys.stdin.read().title())"
Officia Est Omnis Quia. Nihil Et Voluptatem Dolor Blanditiis Sit Harum. Dolore Minima Suscipit Quaerat. Soluta Autem Explicabo Saepe. Recusandae Molestias Et Et Est Impedit Consequuntur. Voluptatum Architecto Enim Nostrum Ut Corrupti Nobis.

Вы также можете использовать такие вещи, как strip() для удаления пробелов или capitalize():

$ echo "  This iS mY USER ${USER}   " | python3 -c "import sys; print(sys.stdin.read().strip().lower().capitalize())"
This is my user jenkins
4 голосов
/ 01 декабря 2017

Еще одна более короткая версия с sed:

sed -e "s/\b./\u\0/g"
4 голосов
/ 01 февраля 2013

У меня были апострофы, так, отрабатывая первое решение ...

mike@mike-laptop3:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g"

Best Western Plus Bob'S Inn

mike@mike-laptop3:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed "s/\( \|^\)\(.\)/\1\u\2/g"

Best Western Plus Bob's Inn

1 голос
/ 16 мая 2019

Предлагаемые sed решения до сих пор будут работать только в том случае, если исходный текст написан строчными буквами. Хотя можно использовать tr '[[:upper:]]' '[[:lower:]]' для нормализации ввода в нижнем регистре, может быть удобно иметь решение «все в одном» sed:

sed 's/\w\+/\L\u&/g'

Это будет соответствовать словам (\w означает символ слова, а \+ хотя бы один и до следующего несловесного символа) и строчные буквы до конца (\L) но заглавные следующий (т.е. первый) символ (\u) в каждом (g) совпавшем выражении (&).

[ Кредиты ]

0 голосов
/ 20 июня 2019

Использование bash (без sed, так что немного не по теме):

msg="this is a message"
for word in $msg
do
   echo -n ${word^} ""
done

This Is A Message
0 голосов
/ 13 октября 2018

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

name="athens"
echo $name | sed -r "s/^[[:alpha:]]/$(echo ${name:0:1} | tr [[:lower:]] [[:upper:]])/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...