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