GNU/Linux >> Linux Esercitazione >  >> Linux

sed da inserire solo alla prima corrispondenza

Puoi fare questo in GNU sed:

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

Ma non è portatile. Poiché la portabilità è buona, eccola in awk:

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

Oppure, se vuoi passare una variabile da stampare:

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

Entrambi inseriscono la riga di testo prima la prima occorrenza della parola chiave, su una riga a parte, secondo il tuo esempio.

Ricorda che sia con sed che con awk, la parola chiave corrispondente è un'espressione regolare, non solo una parola chiave.

AGGIORNAMENTO:

Poiché anche questa domanda è contrassegnata con bash, ecco una soluzione semplice che è pura bash e non richiede 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

Così com'è, questo come un tubo. Puoi facilmente racchiuderlo in qualcosa che agisce invece sui file.


Se ne vuoi uno con sed*:

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

*funziona solo con GNU sed


Questo potrebbe funzionare per te:

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

Ci sei quasi! Basta creare un loop per leggere dal Matched Keyword alla fine del file.

Dopo aver inserito una riga, il resto del file può essere stampato con:

  1. Presentazione di un segnaposto ad anello :a (qui a è un nome arbitrario).
  2. Stampa la riga corrente e carica la successiva nello spazio del pattern con il n comando.
  3. Reindirizza il controllo indietro usando il ba comando che è essenzialmente un goto al a segnaposto. La condizione di fine file è naturalmente curata dal n comando che termina qualsiasi ulteriore comando sed se tenta di leggere oltre la fine del file.

Con un piccolo aiuto da parte di bash, è possibile ottenere un vero one liner:

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

Alternativa:

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

Questo usa Matched Keyword come flag nello spazio di attesa e, una volta impostato, qualsiasi elaborazione viene ridotta mediante salvataggio immediato.


Linux
  1. Converti stringa in esadecimale sulla riga di comando

  2. unix - conteggio delle colonne nel file

  3. sed inserisce una riga con spazi in una riga specifica

  4. lo script bash aggiunge il testo alla prima riga di un file

  5. Sostituzione Sed multilinea

Come inserire del testo prima della prima riga di un file?

Stampa la riga precedente dopo una corrispondenza di pattern utilizzando Sed?

Sed può sostituire i caratteri di nuova riga?

Sed:stampa solo la prima occorrenza di una corrispondenza di pattern?

Sed On Osx inserisce a una certa linea?

Tutorial Unix Sed:aggiungi, inserisci, sostituisci e conta righe di file