Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: makeme в Mar 14, 2021, 13:12



Титла: Заместване със sed на url от променлива
Публикувано от: makeme в Mar 14, 2021, 13:12
Някой може ли да ми помогне да проумея защо това работи:

Код:
echo "https://unix.stackexchange.com/" | sed 's;https://unix.stackexchange.com/;https://www.linux-bg.org;g'

А това не:

Код:
url1="https://unix.stackexchange.com/"
url2="https://www.linux-bg.org"
echo $url1 | sed s;${url1};${url2};g

Пробвах с всякакви размествания на "" '' \\ , но така и не успях да го подкарам.


Титла: Re: Заместване със sed на url от променлива
Публикувано от: makeme в Mar 14, 2021, 13:18
Добре, явно не съм пробвал всичките кавички :)

Ей така стана:

Код:
echo $url1 | sed "s;${url1};${url2};"


Титла: Re: Заместване със sed на url от променлива
Публикувано от: go_fire в Mar 14, 2021, 13:37
Много отдавна не съм писал регулярки. Доколкото разбирам, това казва — започни от началото, вземи това, замени го с другото и така до края. Покрай текстовия ми редактор знам, че регулярките на ГНУ са по-различни от тези на Пърл. По-стари са и имат наследство:

https://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html

Не мога да гарантирам сто процента за sed, но в Емакс единична кавичка (') има специално значение и то всъщност не е на кавичка.

Иначе със сигурност bash има пърлското разбиране. Ако е в двойна пробвай да интерпретираш, ако е в единична го приемай за низ.  В такъв случай единствено двуеточието евентуално ми се вижда проблемен знак (връзката горе). Но някак не ми се вярва. Другото, което не помня, имаше ли „U“ някакво специално значение (uppercase), защото „W“ си беше дума. Ако чука на някое от тия две неща.

Но всичко това са предположения на твърде отдавнашния ми опит с регулярки. Гледам да ги избягвам. В момента на писането им, знаеш, какво си искал, но като мине месец, изглежда на марсиански.

Ето сега се усещам, че при теб го няма условието „почни отначало“.

А бе говоря глупости, не ми обръщай внимание :'(


Титла: Re: Заместване със sed на url от променлива
Публикувано от: makeme в Mar 14, 2021, 15:41
Разбрах те, но то идеята беше именно как да се избегне регикса. От една страна понеже в url-ите има регикс знаци, но от друга да е променлива, което пък ( ' ) прецаква. ( ; ) съм го сложил пък понеже стандартния вариант с (/) не става заради url-то.

Бе някой сеща ли се за по-културен начин за заместване на стрингове в баш? Ако може да не се чупи като се опиташ да заместиш стринг, който е реално парола и вътре има какво ли не  ;D


Титла: Re: Заместване със sed на url от променлива
Публикувано от: go_fire в Mar 14, 2021, 16:51
Bash сам по себе си е текстов редактор. Проблема е, че той понякога (например substring) е дори по-криптичен и от регулярен израз. На всичкото отгоре аз поне не съм попадал на наистина хубаво и изчерпателно ръководство. От сега ти казвам тия на tldp не стават, макар да са най-стари.

Мисля, че най-смислено ми е било:

https://aty.sdsu.edu/bibliog/latex/debian/bash.html

Поне си мисля, че от него съм разбрал най-много.

Туко що ми изскочи:

https://gist.github.com/magnetikonline/90d6fe30fc247ef110a1

Което на пръв поглед ми изглежда прегледно.

За съжаление повечето ресурси използват гадните цензури от Cloudflare и са ми недостъпни.

Много често ми се налага да правя такива неща.

Ето вчера например имах нещо такова:

Код
GeSHi (Bash):
  1. p3='/home/user/t/proba/3-3/'
  2. chrlen=${#p3}
  3.  
  4. for file in "$p3"*; do
  5.  
  6. f=${file:$chrlen}  
  7.  
  8. ...
  9.  
  10. done
  11.  
  12.  

Малко го опростих, за да е по-ясно. Значи на едното шифровано място ( ${#} ) взимам дължината на пътя. На другото ( ${?:?}) я махам от това, което ми връща цикъла. Защото цикъла ми дава не просто имена на документи, ами целия път до тях.

Тия неща не се връзват с питането ти, но просто се опитвам да онагледя откачения начин, по който се правят нещата в bash от пет насам. Но човек свикне ли, спира да му прави впечатление.


Титла: Re: Заместване със sed на url от променлива
Публикувано от: remotexx в Mar 14, 2021, 19:28
Нещо такова ще свърши ли работа?
https://stackoverflow.com/questions/54059656/how-to-search-replace-arbitrary-literal-strings-in-sed-and-awk-and-perl#54059658


Титла: Re: Заместване със sed на url от променлива
Публикувано от: 4096bits в Mar 15, 2021, 08:30
Нещо такова ще свърши ли работа?
https://stackoverflow.com/questions/54059656/how-to-search-replace-arbitrary-literal-strings-in-sed-and-awk-and-perl#54059658
Това ми хареса

Между другото, регулярните е хубаво да се избягват, ако е възможно, защото не са бързички


Титла: Re: Заместване със sed на url от променлива
Публикувано от: go_fire в Mar 15, 2021, 09:01
Вчера и аз се сещах за tr. Благодарение на пропагандата на Хакмена и аз много го ползвам. Но поне по мои спомен, той можеше да работи с не повече от един знак. Поне така беше в по-старите версии, в новите не съм пробвал.

По принцип това за регулярките е вярно по принцип (без Go дето са крайни автомати на Асемблер). Но реално никога не съм удрял в това. Сигурно трябва да е някакъв относително голям код, стотина хиляди реда код, за да се усети.


Титла: Re: Заместване със sed на url от променлива
Публикувано от: 4096bits в Mar 15, 2021, 14:20
Вчера и аз се сещах за tr. Благодарение на пропагандата на Хакмена и аз много го ползвам. Но поне по мои спомен, той можеше да работи с не повече от един знак. Поне така беше в по-старите версии, в новите не съм пробвал.

По принцип това за регулярките е вярно по принцип (без Go дето са крайни автомати на Асемблер). Но реално никога не съм удрял в това. Сигурно трябва да е някакъв относително голям код, стотина хиляди реда код, за да се усети.
Стига и един ред код,но да го изпълниш много, много пъти. Нещо, което редовно се прави, когато се парсват документи или каквото ще да е.