Portál AbcLinuxu, 12. května 2025 11:31
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.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.