GNU/Linux >> Znalost Linux >  >> Linux

vložit pouze na první zápas

Můžete to udělat v GNU sed:

sed '0,/Matched Keyword/s//New Inserted Line\n&/'

Ale není přenosný. Protože přenositelnost je dobrá, zde je v awk:

awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile

Nebo, pokud chcete předat proměnnou k tisku:

awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile

Oba vkládají textový řádek před první výskyt klíčového slova na samostatném řádku podle vašeho příkladu.

Pamatujte, že v případě sed i awk je odpovídající klíčové slovo regulárním výrazem, nikoli pouze klíčovým slovem.

AKTUALIZACE:

Protože tato otázka je také označena jako bash, zde je jednoduché řešení, které je čistý bash a nevyžaduje sed:

#!/bin/bash

n=0
while read line; do
  if [[ "$line" =~ 'Matched Keyword' && $n = 0 ]]; then
    echo "New Inserted Line"
    n=1
  fi
  echo "$line"
done

Jak to stojí, tohle je dýmka. Můžete jej snadno zabalit do něčeho, co funguje se soubory.


Pokud chcete jeden se sed*:

sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt

*funguje pouze s GNU sed


Toto by vám mohlo fungovat:

sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file

Už jste skoro tam! Stačí vytvořit smyčku pro čtení z Matched Keyword na konec souboru.

Po vložení řádku lze zbytek souboru vytisknout pomocí:

  1. Představujeme zástupný symbol smyčky :a (zde a je libovolný název).
  2. Vytiskněte aktuální řádek a načtěte další do prostoru vzoru pomocí n příkaz.
  3. Řízení přesměrování zpět pomocí ba příkaz, který je v podstatě goto na a držitel místa. O stav konce souboru se přirozeně stará n příkaz, který ukončí všechny další příkazy sed, pokud se pokusí přečíst konec souboru.

S trochou pomoci od bash lze dosáhnout skutečného one lineru:

sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file

Alternativa:

sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file

Toto používá Matched Keyword jako vlajka v zadržovacím prostoru a jakmile je nastaven, jakékoli zpracování je omezeno okamžitou kaucí.


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

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

  3. Převeďte řetězec na hexadecimální na příkazovém řádku

  1. unix - počet sloupců v souboru

  2. grep odpovídá pouze řádkům v určeném rozsahu

  3. Jak použít sed k odstranění pouze dvojitých prázdných řádků?

  1. bash skript připojí text k prvnímu řádku souboru

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

  3. Jak porovnat pouze první řádek dvou souborů?