GNU/Linux >> Znalost Linux >  >> Linux

Použít Sed k přidání znaku na N'-tou pozici shodného řetězce?

Potřebuji přidat znak na n'-tou pozici (v tomto případě na 2.) odpovídajícího řetězce.
Například v souboru text.txt Chtěl bych přidat N před řetězec a za " pouze v řetězcích, které obsahují blah

text.txt:

"1blah8","na","8blah4"  
"2blah5","na","10blah4"  
"5blah5","na","1blah234"  

Chci získat text2.txt:

"Ν1blah8","na","Ν8blah4"  
"Ν2blah5","na","Ν10blah4"  
"Ν5blah5","na","Ν1blah234"  

Zkoušel jsem sed 's/.*blah.*/N&/' text.txt > text2.txt
ale dostávám N před " a pouze v prvním nalezeném řetězci každého řádku.

Přijatá odpověď:

Jiný přístup:

$ sed 's/"([^"]*blah[^"]*")/"N1/g' test.txt 
"N1blah8","na","N8blah4"  
"N2blah5","na","N10blah4"  
"N5blah5","na","1blah234

Regulární výraz hledá " , pak 0 nebo více non-" znaky následované blah a poté 0 nebo více non-" znovu. Kvůli závorkám je to zachyceno a později může být označován jako 1 . Proto příkaz nahradí odpovídající vzor sám sebou (1 ), ale s "N připojeno. To je důvod, proč první " je mimo závorku. /g modifikátor na konci umožňuje nahradit všechny odpovídající řetězce v každém řádku.

Pokud váš sed verze to podporuje, můžete to zjednodušit na:

sed -E 's/"([^"]*blah[^"]*")/"N1/g'

Linux
  1. Bash:přidejte řetězec na konec souboru bez zalomení řádku

  2. najít odpovídající text a nahradit další řádek

  3. Jak odstranit znak \r pomocí sed

  1. Použití odkazu na proměnnou bashového řetězce v Sed?

  2. Zabalit první znak řetězce pomocí Sed?

  3. Výměna řetězce pomocí slovníku?

  1. Jak používat příkaz WC k tisku znaků, bajtů, nového řádku a počtu slov v Linuxu

  2. Jak nahradit řetězec v souboru (souborech)?

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