Сделать первый символ после точки с запятой прописным для каждой строки текстового файла

Используйтеpgrepвместо фильтрации вывода из ps. Я думаю, что в вашем случае pgrep -f '^([^ ]*/)?puma 'будет соответствовать правильному процессу, но немного поэкспериментируйте, чтобы убедиться, что вы получаете то, что хотите, и не более того.

Как только вы убедитесь, что pgrepнаходит процесс, который вы хотите убить, замените pgrepна pkill.

2
19.09.2020, 17:47
5 ответов

Не awk или sed, а perl:

perl -C -pe 's/;(.)/;\u$1/g'

Опция -Cвключает или выключает ввод-вывод UTF -8 в зависимости от переменных среды вашей локали(LC_ALLи т. д. ); если вы хотите, чтобы ввод и вывод UTF -8 выполнялись безоговорочно, измените его на -CSD.

Обратите внимание, что использование заглавных букв в Юникоде сложно. Это превратит ихсан в ихсан вместо правильного ихсан(турецкое имя имеет точку над i даже в верхнем регистре ).

8
18.03.2021, 23:03

GNU Сед:

sed 's/;[[:lower:]]/\U&/g' file

Для каждого символа нижнего регистра, следующего за точкой с запятой (;[[:lower:]]), мы делаем его прописным с помощью\Uспециальной последовательности . Флаг gзаменяет все вхождения в строке.

Если GNU Sed недоступен, совместимой с POSIX альтернативой является использование Ex .

printf '%s\n' '%s/;[[:lower:]]/\U&/g' '%p' | ex file

Замещающая команда такая же, но ко всем строкам следует обращаться с помощью %. %pраспечатывает вывод. Если вы хотите изменить файл напрямую, замените %pна x.

10
18.03.2021, 23:03

Использование примера файла @terdon и GNUsed:

$ sed -e 's/;\(.\)/;\U\1/g' file
John Doe;John Doe is...;He lives in...
Mike Nelson;Mike Nelson works for...;He makes...
Émilie du Châtelet;Émilie du Châtelet;Works for...;She makes...
Marcy William;Marcy's mother is...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is...; άσπα likes fish
$ 
2
18.03.2021, 23:03

с использованием Raku (, ранее известного как Perl6)

Преимущество проекта Perl6/Raku заключается в том, что он разработан для изящной обработки Unicode с нуля. Спасибо @terdon за публикацию отличного тестового файла :

.
~$ raku -pe 's:g/ \;(.) /;{$0.uc}/;'  terdon_uni.txt
John Doe;John Doe is...;He lives in...
Mike Nelson;Mike Nelson works for...;He makes...
Émilie du Châtelet;Émilie du Châtelet;Works for...;She makes...
Marcy William;Marcy's mother is...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is...; άσπα likes fish

Выше мы видим захват первого символа после точки с запятой. Флаг :g(, сокращение от :global), перемещается в начало оператора s///, так что мы знаем из get -go, какое совпадение нам нужно. Обратите внимание на захваты в Raku start $0, $1, $2и т. д. «совпадение» (левой )половины оператора s///допустимо использование пробелов -, что улучшает читаемость. «Замена» (правой )половины оператора s///использует {…}для обозначения закрытия.

Ниже я использую маркер захвата <(…)>Раку. Циркумфикс Раку <(…)>эквивалентен флагу Perl5 \K. Сопоставление выполнено, но маркер <(…)>говорит Раку отбросить все снаружи <(…)>и загрузить внутренний (захват )в $/. Поскольку Raku выполняет полное сопоставление, но захватывает только те символы (и ), которые вы хотите изменить, написание замены значительно упрощается :

.
~$ raku -pe 's:g/ \; <(.)> /{$/.uc}/;'  terdon_uni.txt
John Doe;John Doe is...;He lives in...
Mike Nelson;Mike Nelson works for...;He makes...
Émilie du Châtelet;Émilie du Châtelet;Works for...;She makes...
Marcy William;Marcy's mother is...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is...; άσπα likes fish

ХТН.

https://raku.org

2
18.03.2021, 23:03

команда

awk -F ";" '{for(i=1;i<=NF;i++){print toupper(substr($i,1,1)) substr($i,2)}}' filename|sed -e "N;s/\n/;/g" -e "N;s/\n/;/g"

выход

John Doe;John Doe is...;He lives in...
Mike Nelson;Mike Nelson works for...;He makes...
Marcy William;Marcy's mother is...;Marcy travels a lot... 
1
18.03.2021, 23:03

Теги

Похожие вопросы