Portál AbcLinuxu, 8. května 2025 22:50
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 -eHuh, 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.