GNU/Linux >> Linux Esercitazione >  >> Linux

Sed:inserire testo dopo l'ennesimo carattere che precede/segue una determinata stringa?

Usando sed , come inserire del testo dopo un carattere che precede (o segue) una stringa di N occorrenze. Ad esempio, supponiamo che la riga di testo da modificare sia la seguente:

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

Dopo aver trovato questa riga in un file di testo (magari tramite la stringa univoca command ), desidero inserire il testo dopo il secondo (N=2) punto e virgola prima di keyword (cioè il punto e virgola che separa le lines e of ). In particolare vorrei utilizzare sed allo scopo.

Continuando con questo esempio, l'output previsto sarebbe:

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

dove INSERTED_STRING; (fornito a sed, ad es. tramite una variabile shell) è stato inserito nella posizione desiderata.

Risposta accettata:

Io lo preferisco semplice:

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

per inserire due campi prima della parola chiave. La soluzione generale sarebbe

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

ma nota che il N ha un offnet di 1 rispetto alla tua domanda:qui, N=2 significa avere due campi tra l'inserto e la keyword .

Spiegazione:/command/ seleziona solo le righe con command , quindi le altre linee rimangono intatte. ([^;]*;\) corrisponde a un campo (una sequenza di non punti e virgola) incluso il seguente punto e virgola. Seguendolo con \{$N\} il modello corrisponde a $N campi. La seguente keyword lo completa in modo che corrisponda a keyword e il $N campi prima. Il modello di sostituzione è costituito dalla stringa inserita e da & , che viene sostituito da tutto ciò che è stato abbinato (quindi alla fine non era un sostituto, ma un inserto).

Abbreviato e leggibile meglio con le espressioni regolari estese:

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

Linux
  1. Come inserire un testo all'inizio di un file?

  2. trova il testo corrispondente e sostituisci la riga successiva

  3. Inserisci più righe in un file dopo il modello specificato utilizzando lo script della shell

  4. Trova e sostituisci il testo in un file tra un intervallo di righe usando sed

  5. sostituire l'ennesima occorrenza di stringa in ogni riga di un file di testo

Schema di sostituzione dopo l'ennesima corrispondenza trovata su ogni riga??

Come eliminare più righe casuali da un file di testo utilizzando Sed?

Avvolgi il primo carattere di una stringa usando Sed?

Usa Sed per aggiungere il carattere nell'ennesima posizione della stringa corrispondente?

Rimuovere la riga contenente una determinata stringa e la riga seguente?

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