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:
-
h
Questo comando copia il pattern corrente nello spazio di attesa.
-
s/[^X]*X([^Y]*)Y.*/\1/;p
Questo rimuove tutto dallo spazio del modello tranne il testo tra la prima
X
eY
compresi eventuali spazi. Questo viene quindi stampato su stdout. Questo è l'output che viene catturato dalla shell e assegnato avar
. -
x
Questo 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/stderr
La sostituzione viene effettuata e il risultato viene scritto in
stderr
. -
2>&1
Dopo 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.