Sto cercando di trovare uno schema usando sed comando in file.txt tra il primo char1 e char2 e quindi sostituirlo con string. come di seguito con echo esempio di modalità:
echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'
Inoltre ho bisogno di salvare il modello abbinato (come is test {<–spaces around is important} ) in una variabile.
Risposta accettata:
Ecco una singola chiamata di sed che scrive la riga modificata in stdout salvando allo stesso tempo il testo rimosso nella variabile shell var :
$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.
Il valore di var è:
$ echo "==$var=="
== is test ==
Spiegazione:
-
hQuesto comando copia il pattern corrente nello spazio di attesa.
-
s/[^X]*X([^Y]*)Y.*/\1/;pQuesto rimuove tutto dallo spazio del modello tranne il testo tra la prima
XeYcompresi eventuali spazi. Questo viene quindi stampato su stdout. Questo è l'output che viene catturato dalla shell e assegnato avar. -
xQuesto copia lo spazio di attesa nello spazio del modello. Al termine, lo spazio del modello contiene una copia della riga di input originale.
-
s/X[^Y]*Y/REPLACE/; w /dev/stderrLa sostituzione viene effettuata e il risultato viene scritto in
stderr. -
2>&1Dopo che la shell ha catturato stdout in
var, questo indica alla shell di copiare stderr (che ha la riga con REPLACE) su stdout.
A parte la gestione della variabile var
La variabile var include gli spazi iniziali e finali. Se la shell dovesse successivamente assoggettare var alla divisione delle parole, questi spazi verrebbero rimossi. Per evitarlo, quando var è referenziato, fallo tra virgolette, come nell'esempio sopra.