Penso che quello che stai cercando è sed
... è una s tream ndr itor che vi consente di fare sostituzioni con il metodo integrale.
Come stai spiegando, il comando `cat named.local | Zona grep' ti dà un output un po' come questo:
zone "domain1.tld" {
zone "domain2.tld" {
zone "domain3.tld" {
zone "domain4.tld" {
Sto indovinando si desidera che l'uscita sia qualcosa di simile, dal momento che ha detto è necessario il testo tra virgolette:
"domain1.tld"
"domain2.tld"
"domain3.tld"
"domain4.tld"
Quindi, in realtà, da ogni riga vogliamo solo il testo tra le doppie virgolette (comprese le doppie virgolette stesse)
Non sono sicuro che abbiate familiarità con Regular Expressions, ma sono uno strumento inestimabile per ogni persona che scrive script di shell. Ad esempio, l'espressione regolare /.o.e/
corrisponde a qualsiasi riga in cui una parola con la seconda lettera era una minuscola o
e la quarta era e
. Ciò corrisponderebbe stringa contenente parole come "zone
", "tone
", o anche "I am tone-deaf.
"
Il trucco c'era da utilizzare il carattere .
(punto) per indicare "qualsiasi lettera". Esistono un paio di altri caratteri speciali, ad esempio *
che significa "ripeti il carattere precedente 0 o più volte". Così un'espressione regolare come a*
sarebbe partita "a
", "aaaaaaa
", o una stringa vuota: ""
in modo da poter corrispondere alla stringa all'interno delle virgolette con: /".*"/
C'è un'altra cosa si dovrebbe sapere su sed
(e dai commenti, lo fai già!) - consente il backtracking . Una volta che gli hai detto come riconoscere una parola, puoi usare quella parola come parte della sostituzione. Per esempio, diciamo che si voleva trasformare questa lista:
Billy "The Kid" Smith
Jimmy "The Fish" Stuart
Chuck "The Man" Norris
In questa lista:
The Kid
The Fish
The Man
In primo luogo, devi cercare la stringa racchiusa tra virgolette. L'abbiamo già visto, era /".*"/
.
Successivamente, vogliamo utilizzare ciò che è racchiuso tra virgolette.Siamo in grado di gruppo utilizzando parentesi: /"(.*)"/
Se volessimo sostituire il testo con le virgolette con un carattere di sottolineatura, ci piacerebbe fare una sostituzione: s/"(.*)"/_/
, e che ci avrebbe lasciato con:
Billy _ Smith
Jimmy _ Stuart
Chuck _ Norris
Ma abbiamo il backtracking! Questo ci permetterà di ricordare cosa c'era dentro i paren, usando il simbolo \1
. Quindi, se facciamo ora: s/"(.*)"/\1/
ci arriveremo:
Billy The Kid Smith
Jimmy The Fish Stuart
Chuck The Man Norris
Perché le virgolette non erano nelle parentesi, non erano parte del contenuto di \1
!
Per lasciare solo il materiale tra virgolette, è necessario abbinare l'intera linea. (. Che significa "fine linea") Per fare questo abbiamo ^
(che significa "all'inizio della linea"), e $
Così ora se usiamo s/^.*"(.*)".*$/\1/
, ci arriveremo:
The Kid
The Fish
The Man
Perché? Leggiamo l'espressione regolare s/^.*"(.*)".*$/\1/
da sinistra a destra:
In parole povere:. "Leggi l'intera linea, la copia da parte il testo tra le virgolette Poi sostituire l'intera linea con il contenuto tra i doppi qoutes."
È anche possibile aggiungere virgolette doppie attorno al testo sostituendo s/^.*"(.*)".*$/"\1"/
, così ci arriveremo:
"The Kid"
"The Fish"
"The Man"
e che può essere usata da sed
per sostituire la linea con il contenuto dall'interno delle citazioni:
sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
(questo è solo conchiglia sfuggito a che fare con i doppi apici e barre e roba.)
Così l'intero comando di wo ULD essere qualcosa del tipo:
cat named.local | grep zone | sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
Sì, lo sto usando proprio adesso, ma penso che ci dovrebbe essere un modo più semplice per farlo, perché ora uso sed -e 's/zone "// g' | sed -e 's /" { // g 'per rimuovere l'inizio e la fine di un file invece di corrispondere semplicemente al centro. – jpou
Rasare l'inizio e la fine è perfettamente accettabile. Questo non è un concorso - se funziona, va bene. Se vuoi farlo abbinando il testo tra virgolette, dai un'occhiata ai "gruppi catturanti". – zoul
ugh. Ho passato troppo tempo a scriverlo, e non è ancora finito ... sembra che tutti mi abbiano battuto. Ma sono contento che tu abbia già capito :-) – scraimer