#linux #sed
Подскажите, как реализовать с помощью sed : Поставить определенный символ после каждого знака в строке, при этом если есть пробел - то на его месте тоже, но если есть такой символ в строке - его игнорировать (не дублировать). В итоге все знаки должны чередоваться нужным символом через один: Foo bar, 38-popugaev. > F.o.o.b.a.r.,.3.8.-.p.o.p.u.g.a.e.v. Foo bar, 38-popugaev. > F-o-o-b-a-r-,-3-8-p-o-p-u-g-a-e-v-.- То же, но после последнего знака не должно быть как ни этого символа, так и ни какого знака пунктуации: Foo bar, 38-popugaev. > F.o.o.b.a.r.,.3.8.-.p.o.p.u.g.a.e.v Foo bar, 38-popugaev. > F-o-o-b-a-r-,-3-8-p-o-p-u-g-a-e-v Чередовать всю строку то заглавной буквой, то строчной, (как вариант наоборот), при этом игнорируя регистры самой строки: Foo bar, 38-popugaev. > FoO bAr, 38-PoPuGaEv. Foo bar, 38-popugaev. > fOo BaR, 38-pOpUgAeV. То же, но при этом каждое слово в строке должно начинаться с определенного регистра, игнорируя строгую очередность все строки в пользу очередности каждого слова (первый вариант - каждое слово должно начинаться с большой буквы, затем чередование, второй вариант - с маленькой и затем чередование): Foo bar, 38-popugaev. > FoO BaR, 38-PoPuGaEv. Foo bar, 38-popugaev. > fOo bAr, 38-pOpUgAeV. Можно и как отдельный скрипт каждый раз, чтобы запускать sed -f script.sed Спасибо )
Ответы
Ответ 1
Тема достаточно старовата, но тоже поучаствую, 3 пункт: echo "Foo bar, 38-popugaev" | sed -r 's/([а-Яa-Z]{0,1}[^a-Zа-Я]{0,1})([а-Яa-Z]{0,1}[^a-Zа-Я]{0,1})/\U\1\L\2/g' FoO bAr, 38-PoPuGaEv echo "Foo bar, 38-popugaev" | sed -r 's/([а-Яa-Z]{0,1}[^a-Zа-Я]{0,1})([а-Яa-Z]{0,1}[^a-Zа-Я]{0,1})/\L\1\U\2/g' fOo BaR, 38-pOpUgAeV Четвертый пункт отличается от третьего пункта лишь пробелом в исключении: echo "Foo bar, 38-popugaev" | sed -r 's/([а-Яa-Z]{0,1}[^a-Zа-Я ]{0,1})([а-Яa-Z]{0,1}[^a-Zа-Я ]{0,1})/\U\1\L\2/g' FoO BaR, 38-pOpUgAeV echo "Foo bar, 38-popugaev" | sed -r 's/([а-Яa-Z]{0,1}[^a-Zа-Я ]{0,1})([а-Яa-Z]{0,1}[^ a-Zа-Я]{0,1})/\L\1\U\2/g' fOo bAr, 38-PoPuGaEvОтвет 2
можно и так, например: #!/bin/bash s='Foo bar, 38-popugaev.' camel1='s/([[:alpha:]])([^[:alpha:]]*)([[:alpha:]])([^[:alpha:]]*)/\U\1\2\L\3\4/g' camel2='s/([[:alpha:]])([^[:alpha:]]*)([[:alpha:]])([^[:alpha:]]*)/\L\1\2\U\3\4/g' f1() { echo ${s} | sed -r "s/[ ${1}]+/${1}/g;s/./&${1}/g;s/\\${1}\\${1}//g" } f2() { f1 ${1} | sed 's/[[:punct:]]*$//' } f3() { echo ${s} | sed -r ${1} } f4() { echo ${s} | sed -r ":s;h;s/^(\W*)\n(.*)/\2\1/;to;s/^(\W*\w+).*/\1/;${1};H;g;s/^\W*\w+//;ts;bs;:o;s/\n//g" } echo 1 f1 "." f1 "-" echo 2 f2 "." f2 "-" echo 3 f3 ${camel1} f3 ${camel2} echo 4 f4 ${camel1} f4 ${camel2} вывод, например: 1 F.o.o.b.a.r.,.3.8.-.p.o.p.u.g.a.e.v. F-o-o-b-a-r-,-3-8-p-o-p-u-g-a-e-v-.- 2 F.o.o.b.a.r.,.3.8.-.p.o.p.u.g.a.e.v F-o-o-b-a-r-,-3-8-p-o-p-u-g-a-e-v 3 FoO bAr, 38-PoPuGaEv. fOo BaR, 38-pOpUgAeV. 4 Foo Bar, 38-PoPuGaEv. fOo bAr, 38-pOpUgAeV.
Комментариев нет:
Отправить комментарий