Oprava zdvojených lomítek

UIO

Oprava zdvojených lomítek
« kdy: 11. 11. 2017, 13:22:58 »
Dobry den.

Nemuzu nikde najit jak opravit-nahradit v shellu (v promene)  vsechny zdvojene lomitka za nezdvojena
Kód: [Vybrat]
myVar="/1//2/3/4//5//6/"Podařilo se mi dohledat tohle ale nejde mi to.
Kód: [Vybrat]
a=${var//\//\\\\}Poradi nekdo? Dekuji


Jose D

  • *****
  • 626
    • Zobrazit profil
Re:Oprava zdvojených lomítek
« Odpověď #1 kdy: 11. 11. 2017, 15:06:50 »
vsechny zdvojene lomitka za nezdvojena

V praxi delam regexp nahrady v sedu, takze to by slo asi takhle:

Kód: [Vybrat]
cenzored@cenzored:~$ echo "/aa///////trolololo/////gegegege" | sed -E 's/(\/)+/\//g'
/aa/trolololo/gegegege
cenzored@cenzored:~$

Princip je asi jasny, musis vyescapovat lomitko aby se bralo jako normalni znak. Je to napsany obecneji aby to nahradilo jakykoliv pocet lomitek jednim lomitkem. Jestli fakt potrebujes nahradit jen dve lomitka, tak uprava je snad zrejma. Ve skutecnosti bych na cestu radsi nekoukal jako na string, ale jako pythonista bych vzal neco jako os.path a nechal to na te tride at se s tim popere.

Re:Oprava zdvojených lomítek
« Odpověď #2 kdy: 11. 11. 2017, 15:20:49 »
Tohle jde snadno i přímo v Bashi bez volání jiného interpretru na regexy.

Pro náhradu: "//" -> "/" je to takhle:

echo ${myVar//\/\//\/}

tzn. před každým lomítkem ve vyhledávaném řetězeci nebo náhradě musí být ještě zpětné - jak bylo řečeno je to escape znak.
Navíc je zdvojené i první lomítko za názvem proměnné, protože to pak nahrazuje všechny výskyty vyhledávaného řetězce.. bez zdvojení by to nahradilo jen první výskyt. Je to podobné jako přepínač /g v sedu.