Mám podezření, že to nemůžete udělat ve standardním sed
, ale můžete to udělat pomocí Perlu nebo něčeho jiného s výkonnějším zpracováním regulárních výrazů.
$ echo "She sells sea shells by the sea shore" |
> perl -pe 's/(sh[a-z]*)/"." x length($1)/gei'
... sells sea ...... by the sea .....
$
e
modifikátor znamená, že nahrazující vzor je spustitelný skript Perl; v tomto případě opakuje znak .
tolikrát, kolikrát je ve shodném vzoru znaků. g
modifikátor se opakuje přes řádek; i
modifikátor je pro párování bez rozlišení velkých a malých písmen. -p
volba Perl vytiskne každý řádek po zpracování ve skriptu určeném -e
volba — náhradní příkaz.
dělá tento awk-oneliner práci za vás?
awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1' file
otestujte se svými údaji:
kent$ echo "She sells sea shells by the sea shore"|awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1'
... sells sea ...... by the sea .....
Stará otázka, ale našel jsem pěkné a poměrně krátké jednořádkové řešení:
sed ':a;s/\([Ss]h\.*\)[^\. ]/\1./;ta;s/[Ss]h/../g'
Funguje tak, že ve smyčce nahrazuje jeden znak po druhém.
:a;
spustit smyčku
s/\([Ss]h\.*\)[^\. ]
vyhledejte sh
následuje libovolné číslo .
s (naše dokončená práce) následovaná znakem bez tečky nebo mezery (co nahradíme)
/\1./;
nahradit ji naší dosud dokončenou prací plus dalších .
.
ta;
pokud jsme provedli nějakou substituci, smyčku, jinak...
s/[Ss]h/../g
nahraďte sh
s dvěma .
s a nazvěte to den.