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;&/"