Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

sed - несколько нестандартных задач по переделке строки

#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.

Комментариев нет:

Отправить комментарий