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.