GNU/Linux >> Znalost Linux >  >> Linux

Nahrazení vzoru po N-té shodě se najde na každém řádku?

Tato otázka zde již obsahuje odpovědi :sed:smazat všechny výskyty řetězce kromě prvního

(4 odpovědi)
Uzavřeno před 2 lety.

Mám soubor obsahující řádky:

india;austria;japan;chile
china;US;nigeria;mexico;russia

Chci nahradit všechny výskyty středníku na každém řádku např. ;NEW; , ale pouze od 2. výskytu. Výsledek by měl vypadat takto:

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

Zkoušel jsem to s gsub, ale nahradí všechny výskyty:
awk '/;/{gsub(/;/,";NEW;") }{print}'

Přijatá odpověď:

awk řešení je mnohem delší, ale je snazší jej vytvořit obecně:

awk -F; '{for(i=1;i<NF;i++)printf"%s;%s",$i,(i>=2)?"NEW;":"";print$NF}' replacefile

Je možné to udělat pomocí sed také vytvořením smyčky s t příkaz a vždy nahraďte 2. (nebo kterýkoli chcete) oddělovač nějakou dočasnou značkou (obvykle n ):

sed ':b;s/;/n/2;tb;s/n/;NEW;/g' replacefile

Linux
  1. Shoda víceřádkového vzoru pomocí Sed, Awk nebo Grep?

  2. Najít číslo řádku, které obsahuje vzor, ​​pomocí vlastního oddělovače regulárního výrazu?

  3. Vrátit pouze část řádku po odpovídajícím vzoru?

  1. Sed na Osx vložce na určitém řádku?

  2. Bash Script:Jak přiřadit každý řádek výstupu příkazu k hodnotám v poli?

  3. Odstraňte mezery na každém začátku řádku souboru pomocí bash

  1. vložit pouze na první zápas

  2. Koncept 'Hold space' a 'Pattern space' v sed

  3. sed - vložit řádek za X řádků po shodě