Risposte:
awk potrebbe essere uno strumento migliore qui.
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
Cerca le righe che contengono "POP3_SERVER_NAME"; stampa l'ultimo campo. Questo non dipende dal fatto che POP3_SERVER_NAME sia sempre sulla linea 3, che è probabilmente una buona cosa.
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
A seconda dell'applicazione, potrebbe essere necessario rendere l'espressione regolare più rigorosa. Ad esempio, potresti voler corrispondere solo a quella riga che inizia con POP3_SERVER_NAME.
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
L'uso di sed è un po 'meno intuitivo. (Grazie, sono a conoscenza dell'ironia.) Indirizza la riga che contiene POP3_SERVER_NAME ovunque. Sostituisci una stringa vuota per tutto il testo dall'inizio della riga allo spazio opzionale che segue "=". Quindi stampa.
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awk
spazi in qualcos'altro usando -F
. Ad esempio: -F "="
verrà utilizzato =
come delimitatore nel caso in cui si menziona.
Sostituisci il p
comando con una sostituzione che rimuove la parte indesiderata della linea.
sed -n '3 s/^[^=]*= *//p' installation.sh
Potresti voler abbinare la linea per parola chiave anziché per posizione.
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
Sembra che tu abbia un file di configurazione. Quello che potresti fare è simile a quello che suggeriscono Adam Siemeon / slm:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
dove [^=]
esclude tutti '=' caratteri, +
dice uno o più dello stesso tipo di carattere, questo segue un effettivo =
, \s
qualsiasi spazio vuoto (comprese le linguette \t
e nuove linee \n
, \r\n
, e spazi semplici '', che *
significa zero o più dello stesso tipo , le parentesi catturano ciò che c'è dentro per posizionare le sequenze di caratteri corrispondenti nei segnaposto sostitutivi \ 1, \ 2, ..., \ n, $
significa la fine di una riga. Questo segue il tipico schema di sostituzione di:. s/.../.../modifiers
L'opzione della riga di comando -r
sta per sintassi regex estesa (per comodità) e -n
significa che non viene emesso nulla fino a quando o se non richiesto esplicitamente. Il p
modificatore stampa il risultato.
È possibile effettuare una ricerca globale con il g
modificatore come:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
in modo da ottenere una stringa separata da ' '
(potrebbe essere \n
, \t
o quel che avete), che è possibile elaborare facilmente.
Entrambi sono validi a condizione che i valori preceduti dall'equazione si estendano fino alla fine di una riga e non siano seguiti da commenti o altri caratteri con semantica che si discosti da un semplice "valore".
Non posso ancora commentare qui sui post degli altri. Per indicare la riga basta passare il numero della riga, nel tuo caso 3, prima s
o prima del carattere di quotazione iniziale (proprio come in vim).
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
Per favore, dai un'occhiata info sed
. Ad esempio, 3.2 e 4.7 sono di particolare interesse per te.
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
O se hai i contenuti in un file:
sed 's/.*= //' somefile.txt
localhost
Il bello di Linux / Unix è che di solito c'è più di un modo per realizzare qualcosa. Nel caso dell'operazione, ci sono almeno quattro modi diversi per estrarre il nome del server POP dal file:
grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
awk
comando è carino, ma solo se hai spazi attorno a=
. Non funzionerà perPOP3_SERVER_NAME=localhost
.