Portál AbcLinuxu, 26. prosince 2025 07:07
Dobry den,
jde mi o script do cronu, kde kazda skupina web* bude mit uzivatele www-data. Nejde mi o jina reseni jako ulozit do druheho souboru a diffnout, ci podobne, jde mi o reseni ciste, tzn. presne tohle ... ovsem sed mi nebere neznamou. Jak udelat, aby ji sed bral ?
#!/bin/sh
for i in `grep web* /home/rexxor/gransy/group | grep -v www-data` ;do
sed -e s/$i/$i,www-data/ /home/rexxor/gransy/group
done
Zkusim to rozebrat ..
Vyber vsechny skupiny zacinajici web ze souboru group a neobsahujici souslovi www-data (prvni radek for).
Problem : sed -e s/$i ...
Nenacita se neznama z i, ale $i se nacita jako string.
sed -e s/... určitě nic do souboru nezapíše, vypíše to na standarní výstup.
Nechete si ten script nejdrive odzkouset bez promenych ?
Ja bych nerad byl nezdvorily, ale zpochybnenim problemu dany problem nevyresite a script je bez promenych zcela funkcni. Jde mi o to, inkludovat cistou formou $i do sedu, coz je pochopitelne.
Uvedeny priklad je osekany jen jak je to mozne, aby neztratil smysl a nemusel jsem nikoho zahlcovat zbytecnymy podrobnostmi.
Muj problem zni jasne : substituce v sedu s promenou $i na $i,www-dataweb1...........cricket
web2...........cricket
web3...........www-data,cricket
web1 ..........cricket,www-data
web2...........cricket,www-data
web3...........www-data,cricket
[tsunami@vodik]$ cat /tmp/a web1:cricket web2:cricket web3:www-data,cricket [tsunami@vodik]$ for i in `grep web* /tmp/a | grep -v www-data`; do sed -e s/$i/$i,www-data/ /tmp/a ; done web1:cricket,www-data web2:cricket web3:www-data,cricket web1:cricket web2:cricket,www-data web3:www-data,cricketJak jsem psal, ten sed nemodifikuje soubor, ale vypisuje to na standardní výstup.
[tsunami@vodik]$ cat /tmp/a web1:cricket web2:cricket web3:www-data,cricket [tsunami@vodik]$ sed -e /www-data/\!s/^web.*/\&,www-data/ /tmp/a >/tmp/tmp_soubor.$$; mv /tmp/sed_temp_soubor.$$ /tmp/a [tsunami@vodik]$ cat /tmp/a web1:cricket,www-data web2:cricket,www-data web3:www-data,cricket
Nevrací ti ten grep náhodou hodnotu např. obsahující mezeru nebo lomítko ?
Minimálně bych kvůli mezerám uzavřel výraz pro sed do uvozovek.
sed -e "s/$i/$i,www-data/" /home/rexxor/gransy/group
for i in `grep web* /home/rexxor/gransy/group | grep -v www-data` ;doProtože je grepu předáván vzorek obsahující hvězdičku bez uvozovek, shell se ji pokusí expandovat a pokud v adresáři, ze kterého se spouští, existuje(í) soubory začínajicí znaky web, jejich název se dosadí do vzorku.
Každopádně to nic nemění na tom, že je ten for zbytečný, protože procházet sedem pro každý nalezený řetězec celý soubor je nesmysl. Lepší je vše nahradit najednou.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.