Portál AbcLinuxu, 1. listopadu 2025 09:15
echo kočka pes | sed -e 's/kočka/kotě/' -e 's/pes/pejsek/'
echo kočka pes | awk '{ gsub(/kočka/, "kotě"); gsub(/pes/, "pejsek"); print $0 }'
gsub spolehnout na implicitní $0 pro řetězec, jehož se týká náhrada. Pro print, který v tomto ohledu chová stejně, jej uvést explicitně. ;) Já vím, že je to celkem hnidopišina, ale trocha štábní kultury a konzistence je dobrá věc.
print jsem prostě zapomněl. Díky za poznámku. Naprosto jí rozumím, já jsem taky hnidopich
A já jsem další hnidopich. 
gsub nepodporuje awk na Solarisu, který mám v práci. Ten podporuje až nawk.
A jak na Solarisu tak na AIXu 5, žádná verze awk nepodporuje UNICODE. Podle mých zkušeností, přechod na awk způsobí jen problémy.
gawk (a GNU nástroje obecně). Nicméně je pravda, že na Slarisu obvykle volám nawk celkem automatcky.
Ale hlavně, správná odpověď byla stejně sub a ne gsub, protože ten sed taky říkal s/pat1/pat2/ a ne s/pat1/pat2/g (to tedy stále neřeší ten Solaris a awk vs. nawk). A není to hnidopišení legrace? ;)
Ptám se, protože AWK umožněně použít escape sekvence, tedy můžu například obarvit text...Se zatnutými zuby to jde i v sedu
:
echo kočka pes \
| sed \
-e 's/kočka/\\\\033[01;32mkotě\\\\033[0m/' \
-e 's/pes/\\\\033[01;34mpejsek\\\\033[0m/' \
| xargs echo -e
Huh, snad se to zkopírovalo správně a snad to funguje i na jiném než mém terminálu.
awk vypadalo nutně estetičtěji. sed, zejména pokud se to trochu zkomplikuje a začnou se používat podmínky a skoky a odkladiště... se docela blbě čte (ale zase se dobře píše, pokud tedy chceme ušetřit psaní na klávesnici), ale tohle není ten případ (to je jenom nahrazení "škaredým" řetězcem.
Co může pomoci to zčitelnit: sed nemusí mít jednotlivé vzory oddělené / (kumulace dopředných (navíc občas "escapovaných") lpmítek a houf zpětných tomu moc neprospívá. Třeba na Solarisu to může být cokoliv kromě \ a <newline>. Osobně právě kvůli čitelnosti upřednostňuji # nebo |.
No a pak si můžete pomoc nadefinováním proměnných v shellu a zpřehlednit to jejich použitím.
No a ještě pokud se chcete vyhnout mohutnému "escapování" a kumulování zpětných lomíte, tak můžete vkládat rovnou <ESC> pomocí ctrl-v, bude to možná o drobet lépe vypadat, ale zase si bezpečně rozbijete kopírovat/vložit myší.
Třeba takhle:
zelena='^[[01;32m'
modra='^[[01;34m'
seda='^[[0m'
echo kocka pes \
| sed \
-e "s|kocka|${zelena}kote${seda}|" \
-e "s|pes|${modra}pejsek${seda}|" \
| cat
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.