Я пытаюсь сделать первую букву каждого слова в строке заглавной, используя следующую команду sed, но она не работает:
echo "my string" | sed 's/\b\(.\)/\u\1/g'
Выход:
my string
Что я делаю не так?
Спасибо
Я пытаюсь сделать первую букву каждого слова в строке заглавной, используя следующую команду sed, но она не работает:
echo "my string" | sed 's/\b\(.\)/\u\1/g'
Выход:
my string
Что я делаю не так?
Спасибо
Это уже было рассмотрено: Заглавная буква слов с использованием SED
Я получаю правильное поведение с GNU sed, но не со стандартным BSD sed, который поставляется с OS X. Я думаю, что \u "регулярное выражение" - это вещь GNU. Как насчет «порт установить gsed»?
Редактировать: если вы действительно хотите использовать BSD sed, что я бы не рекомендовал (потому что команда становится очень уродливой), то вы можете сделать следующее: sed -E "s:([^[:alnum:]_]|^)a:\1A:g; s:([^[:alnum:]_]|^)b:\1B:g; s:([^[:alnum:]_]|^)c:\1C:g; s:([^[:alnum:]_]|^)d:\1D:g; s:([^[:alnum:]_]|^)e:\1E:g; s:([^[:alnum:]_]|^)f:\1F:g; s:([^[:alnum:]_]|^)g:\1G:g; s:([^[:alnum:]_]|^)h:\1H:g; s:([^[:alnum:]_]|^)i:\1I:g; s:([^[:alnum:]_]|^)j:\1J:g; s:([^[:alnum:]_]|^)k:\1K:g; s:([^[:alnum:]_]|^)l:\1L:g; s:([^[:alnum:]_]|^)m:\1M:g; s:([^[:alnum:]_]|^)n:\1N:g; s:([^[:alnum:]_]|^)o:\1O:g; s:([^[:alnum:]_]|^)p:\1P:g; s:([^[:alnum:]_]|^)q:\1Q:g; s:([^[:alnum:]_]|^)r:\1R:g; s:([^[:alnum:]_]|^)s:\1S:g; s:([^[:alnum:]_]|^)t:\1T:g; s:([^[:alnum:]_]|^)u:\1U:g; s:([^[:alnum:]_]|^)v:\1V:g; s:([^[:alnum:]_]|^)w:\1W:g; s:([^[:alnum:]_]|^)x:\1X:g; s:([^[:alnum:]_]|^)y:\1Y:g; s:([^[:alnum:]_]|^)z:\1Z:g;"
Учитывая ваш образец ввода, это будет работать в любом awk:
$ echo 'my string' | awk '{for (i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)} 1'
My String
Если это не делает то, что вы действительно хотите, отредактируйте свой вопрос, чтобы показать более репрезентативный образец входных данных и ожидаемый результат.
Вот решение sed, которое работает на OSX:
echo 'my string
ANOTHER STRING
tHiRd StRiNg' | sed -En '
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
:loop
h
s/^(.*[^a-zA-Z0-9])?([a-z]).*$/\2/
t next
b end
:next
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/^(.+)\n(.*[^a-zA-Z0-9])?[a-z](.*)$/\2\1\3/
t loop
:end
p
'
Output:
My String
Another String
Third String
Команда sed работает следующим образом:
Вот как работает цикл:
Тестирование скорости выполнения показало, что текущий подход sed выполняется примерно с той же скоростью, что и решение awk, представленное Эдом Мортоном.
Пытаться:
echo "my string" | sed -r 's/\b(.)/\u\1/g'