GNU/Linux >> Znalost Linux >  >> Linux

nahraďte text stejnou délkou pomocí sed

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.


Linux
  1. Manipulace s textem na příkazovém řádku pomocí sed

  2. Používáte Notify-Send s Cronem?

  3. Doplnění s „sed“?

  1. Jak nahradit text podobný sedu pythonem?

  2. Najděte a nahraďte text v souboru mezi rozsahy řádků pomocí sed

  3. nahradit n-tý výskyt řetězce v každém řádku textového souboru

  1. Použití sed k nalezení a nahrazení textových souborů v Linuxu

  2. Použití příkazů Sed,ex a perl k vyhledání a nahrazení textu v Linuxu

  3. Použití více vzorů najednou pomocí příkazu Sed