GNU/Linux >> Znalost Linux >  >> Linux

Jak rekurzivně nahradit znaky sed?

Můžete:

> echo XXXX | sed -e ':loop' -e 's/XX/XoX/g' -e 't loop'
XoXoXoX

S:

  • -e ':loop' :Vytvořte štítek „smyčka“
  • -e 't loop' :Přejít na štítek "smyčka", pokud bylo předchozí nahrazení úspěšné

V tomto konkrétním případě by byl užitečný pohled dopředu nebo pohled dozadu. Myslím, že GNU sed tyto nepodporuje. S perl :

perl -ne 's/X(?=X)/Xo/g; print;'

Můžete také použít lookbehind a lookahead jako:

s/(?<=X)(?=X)/o/g

Kde:

(?<=X) je pozitivní lookbehind, tvrzení o nulové délce, které zajišťuje, že máme X před aktuální pozicí
(?=X) je pozitivní výhled, tvrzení o nulové délce, které zajišťuje, že za aktuální pozicí máme X

Použití v perlu one-liner:

perl -pe 's/(?<=X)(?=X)/o/g' inputfile

Kde:

-p způsobí, že Perl převezme smyčku kolem programu s implicitním tiskem aktuálního řádku


Odpověď v opakování je obecný způsob, jak udělat to, na co se ptáte.

Nicméně v případě vašich dat, za předpokladu, že používáte GNU, můžete jednoduše:

sed 's/\B/o/g'

\b a \B možnosti jsou rozšíření regulárního výrazu:

  • \b odpovídá hranicím slov, tj. přechodu ze znaku „slova“ na znak „bez slova“ nebo naopak
  • \B odpovídá opaku \b . tj. mezery "uvnitř" slov. To nám umožňuje vkládat znaky dovnitř slova, ale ne vně, jak je požadováno.

Zkuste to online.

To předpokládá, že vstupní znaky jsou ve skutečnosti všechny „slovní“ znaky.

Alternativně, pokud nemáte GNU sed nebo pokud vstupní znaky nejsou všechny „slovní“ znaky, stále můžete dosáhnout svého cíle bez opakování:

sed 's/./&o/g;s/o$//'

Tím jednoduše umístíte o po každém znaku a poté odstraní poslední o z řetězce.

Zkuste to online.


Linux
  1. Jak dosáhnout přenositelnosti pomocí Sed -i (úpravy na místě)?

  2. Jak použít Sed k výměně víceřádkového řetězce?

  3. Jak nahradit řetězec řetězcem obsahujícím lomítko se Sed?

  1. Jak použít Sed nebo Ex k nahrazení bloku (víceřádkového kódu) novým blokem textu (kódu)?

  2. Může Sed nahradit nové řádkové znaky?

  3. Používáte Sed se speciálními znaky?

  1. Jak nahradit Grub Burgem?

  2. Jak nahradit MySQL za MariaDB na CentOS 6

  3. Jak použít sed k nahrazení proměnné konfiguračního souboru?