GNU/Linux >> Znalost Linux >  >> Linux

Sed:Vložit text za N-tý znak před/za daným řetězcem?

Pomocí sed , jak by se vkládal text za znak, který předchází (nebo následuje) nějaký řetězec pomocí N výskytů. Předpokládejme například, že řádek textu, který se má upravit, je následující:

command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'

Po nalezení tohoto řádku v textovém souboru (možná prostřednictvím jedinečného řetězce command ), chci vložit text za druhý (N=2) středník před keyword (tj. středník oddělující lines a of ). Konkrétně bych chtěl použít sed za tímto účelem.

Pokračujeme-li v tomto příkladu, očekávaný výstup by byl:

command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'

kde INSERTED_STRING; (poskytovaný do sed, např. prostřednictvím proměnné shellu) byl vložen na požadovanou pozici.

Přijatá odpověď:

Upřednostňuji to jednoduché:

sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'

pro vložení dvou polí před klíčové slovo. Obecné řešení by bylo

sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"

ale všimněte si, že N má offnet 1 ve srovnání s vaší otázkou:Zde N=2 znamená mít dvě pole mezi vložkou a keyword .

Vysvětlení:/command/ vybere pouze řádky s command , takže ostatní řádky zůstanou nedotčeny. ([^;]*;\) odpovídá jednomu poli (posloupnosti jiných než středníků) včetně následujícího středníku. Pokud jej budete následovat pomocí \{$N\} vzor odpovídá $N pole. Následující keyword dokončí to, aby odpovídalo keyword a $N pole dříve. Vzor náhrady se skládá z vloženého řetězce a & , který je nahrazen vším, co bylo spárováno (takže to nakonec nebyla náhrada, ale vložka).

Zkrácené a lépe čitelné s rozšířenými regulárními výrazy:

sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"

Linux
  1. Jak vložit text před první řádek souboru?

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

  3. Odstraňte výskyty řetězce v textovém souboru

  1. Odstraňte liché nebo sudé řádky z textového souboru

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

  3. Jak vložím text do 1. řádku souboru pomocí sed?

  1. Jak zkombinovat všechny řádky, které končí znakem zpětného lomítka?

  2. Jak odstranit více náhodných řádků z textového souboru pomocí Sed?

  3. Jak nastavit kurzor za poslední znak ve vim?