Esegui un comando in 'sed'


9

Ho un elenco di indirizzi di memoria casuali salvati in un file di testo e ho bisogno di seduscirne, decodificarli e salvarli nel mio file. Tuttavia, l'operazione di decodifica che sto tentando di eseguire è gestita in un programma C ++ che ho creato qualche tempo fa. Il problema che sto riscontrando ora è l'esecuzione del C ++ all'interno del sedcomando; vale a dire, voglio fare un riferimento indietro alla parte che deve essere decodificata e usarla come argomento nel mio programma C ++. Ho scritto il seguente comando:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

prima ho avuto la possibilità di leggere una risposta in questo post dicendo che sedNON esegue i comandi. È vero che sednon consente l'esecuzione di comandi? In tal caso, supponendo che il comando che ho scritto sia una sedsequenza valida , come lo scriverei perl?


collegamento aggiunto. my bad :)
Fadi Hanna AL-Kass

Risposte:


8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: like sed: elabora l'input di una riga alla volta $_, valuta la perl [e] xpression passata -eper ogni riga e [p] stampa la modifica $_per ciascuna.
  • s|X|Y|gei: Substitute Yper Xa $_([g] lobally, caso [i] nsensitively, e trattare Ycome Perl [e] xpression invece di una stringa di base).
  • (?<=0x): cercare dietro 0x.
  • [0-9a-f]{1,8}: da una a 8 cifre esadecimali, il maggior numero possibile
  • `./convAddrs $&`: sostituisci con l'output di quella riga di comando della shell dove $&viene sostituito dalla parte corrispondente.

Ricevo il seguente errore durante l'esecuzione del comando: Non avere spazio tra pattern e seguente parola è deprecato alla riga -e 1. I modificatori di espansione "/ a" e "/ d" si escludono a vicenda alla riga 1, alla fine di linea I modificatori "/ a" e "/ d" di Regexp si escludono a vicenda alla riga 1e, alla fine della riga Impossibile trovare il terminatore di stringa "` "ovunque prima di EOF alla riga
1.e

1
Certo, mi dispiace mio male, è necessario cambiare il separatore poiché non possiamo usarlo /qui poiché è utilizzato all'interno della parte di ricambio. Corretto.
Stéphane Chazelas,

Dannazione, e ho pensato che ero abbastanza bravo in Perl one liner, +1!
terdon

2

Potrebbe non essere vero che sednon è possibile eseguire comandi. E ' non è vero di un GNU sed:

sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e  's/\n.//gp;g;s/^/#/e' <"$1"

Non mi è chiaro esattamente cos'altro potrebbe essere nel tuo <$1input, e quindi mi occupo di #commentare tutto ciò che non è command \2nello spazio del pattern. Quando usi il eflag xecute di GNU su un s///ubstitution, passa l'intero spazio di pattern risultante al $SHELL -csuo secondo argomento, e successivamente sostituisce tutto lo spazio di pattern con tutto ciò che è scritto nello $SHELLstdout di quello. Quindi io sopra stampo qualunque sia il tuo risultato prima prima, e poi dopo i risultati del passaggio della riga di comando alla shell.

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.