utilizzando sed con e commerciale (&)


19

Sto usando sed per trovare e sostituire i pattern nei file SAS che ho piuttosto che cambiarli individualmente. Il problema è che sto cercando di sostituire le variabili macro e quando uso la e commerciale non viene elaborata correttamente.

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

ogni volta che eseguo questo comando sembra aggiungere e fare tutti i tipi di cose funky con il testo originale.

Domanda: Come posso sostituire il testo che contiene e commerciali con il comando sed?


6
&è un carattere speciale, quindi deve essere evitato quando viene utilizzato nell'RHS - nel tuo caso devi scappare 's/user=&uid./user=\&sysuserid./g'anche se sospetto che devi anche sfuggire al punto nell'LHS per abbinare un punto letterale, quindi effettivamente necessario's/user=&uid\./user=\&sysuserid./g'
don_crissti

1
sì, '&' a destra significa sostanzialmente "tutto ciò che corrisponde a sinistra", quindi sfuggilo con '\'. Dovresti fare in modo che la risposta, piuttosto che solo un commento.
Edward Falk,

non ho dovuto sfuggire al primo periodo ... solo un testa a testa in chiunque altro era curioso :)
lucasdavis500

Risposte:


25

&è speciale nel testo di sostituzione: significa “tutta la parte dell'ingresso che è stata compensata dalla pattern”, in modo da quello che stai facendo qui sostituisce user=&uidXcon user=user=&uidXsysuserid.. Per inserire una e commerciale nel testo sostitutivo, utilizzare \&.

Un'altra cosa che sembra sbagliata è che .nel modello di ricerca sta per qualsiasi carattere (tranne una nuova riga), ma .alla fine del testo di sostituzione è un punto letterale. Se si desidera sostituire solo la stringa letterale user=&uid., proteggerla .con una barra rovesciata.

sed -e 's/user=&uid\./user=\&sysuserid./g'

Se vuoi sostituire un personaggio qualsiasi e conservarlo nel risultato, metti il ​​personaggio in un gruppo e usa \1il rimpiazzo per fare riferimento a quel gruppo.

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

Infatti, data la ripetizione tra il testo originale e il testo sostitutivo, dovresti comunque utilizzare i gruppi:

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

cioè “sostituire uda sysusertra user=&e id.”.


potresti spiegare i gruppi?
lucasdavis500,

2
@ lucasdavis500 Un gruppo identifica una parte del modello. È delimitato da parentesi rovesciate. Ad esempio \(user=&\)è un modello che corrisponde user&e memorizza la stringa di corrispondenza come gruppo (gruppo numero 1 poiché è il primo gruppo nel modello). Quindi nella sostituzione \1viene sostituita la stringa memorizzata per il gruppo numero 1.
Gilles 'SO- smetti di essere malvagio'

intendi (utente = &) archivia utente = &, non utente &?
lucasdavis500,

@ lucasdavis500 Non capisco il tuo commento. Il carattere =nelle espressioni regolari e nel testo sostitutivo rappresenta se stesso, quindi user=&corrisponde solo user=&e user=&nei rendimenti del testo sostitutivo user=seguiti dalla parte della riga corrispondente alla regex.
Gilles 'SO- smetti di essere malvagio' il

1
@ lucasdavis500 Il =personaggio non ha alcun significato speciale. user=&nel testo sostitutivo produce user=seguito dal testo originale corrispondente. user=\&nel testo sostitutivo produceuser=&
"SO-smetti di essere malvagio" di Gilles il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.