Respuestas:
awk podría ser una mejor herramienta aquí.
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
Busque líneas que contengan "POP3_SERVER_NAME"; imprime el último campo. Esto no depende de que POP3_SERVER_NAME esté siempre en la línea 3, lo que probablemente sea algo bueno.
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
Dependiendo de su aplicación, es posible que deba hacer que la expresión regular sea más estricta. Por ejemplo, es posible que desee hacer coincidir solo esa línea que comienza con POP3_SERVER_NAME.
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
Usar sed es un poco menos intuitivo. (Gracias, soy consciente de la ironía). Dirija la línea que contiene POP3_SERVER_NAME en cualquier lugar. Sustituya una cadena vacía por todo el texto desde el comienzo de la línea hasta el espacio opcional que sigue a "=". Luego imprime.
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awk
de espacios a otra cosa utilizando -F
. Por ejemplo: -F "="
se usará =
como delimitador en el caso que mencione.
Reemplace el p
comando por una sustitución que elimine la parte no deseada de la línea.
sed -n '3 s/^[^=]*= *//p' installation.sh
Es posible que desee hacer coincidir la línea por palabra clave en lugar de por posición.
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
Parece que tienes un archivo de configuración. Lo que podría hacer es similar a lo que sugiere Adam Siemeon / slm:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
donde [^=]
excluye todos los '=' caracteres, +
dice una o más del mismo tipo de carácter, este seguido por un real =
, \s
cualquier espacio en blanco (incluyendo las lengüetas \t
y las nuevas líneas \n
, \r\n
y espacios lisos '', mientras que *
medios de cero o más del mismo tipo , los paréntesis capturan lo que hay dentro para colocar las secuencias de caracteres coincidentes en los marcadores de posición de reemplazo \ 1, \ 2, ..., \ n, $
significa el final de una línea. Esto sigue el patrón de reemplazo típico de:. s/.../.../modifiers
La opción de línea de comando -r
significa sintaxis de expresiones regulares extendida (por conveniencia) y -n
significa que no se genera nada hasta que se solicite explícitamente o no. El p
modificador imprime el resultado.
Puede realizar una búsqueda global con el g
modificador como:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
de manera que se obtiene una cadena separada por ' '
(podría ser \n
, \t
o lo que sea) que se puede procesar fácilmente.
Ambos son válidos siempre que sus valores precedidos por el carácter de la ecuación se extiendan hasta el final de una línea y no sean seguidos por comentarios u otros caracteres cuya semántica se desvíe de un simple "valor".
Todavía no puedo comentar aquí sobre las publicaciones de otros. Para indicar la línea, simplemente pase el número de línea, en su caso 3, antes s
o antes del inicio de la cotización (como en vim).
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
Por favor, eche un vistazo info sed
. Por ejemplo, 3.2 y 4.7 son de particular interés para usted.
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
O si tiene el contenido en un archivo:
sed 's/.*= //' somefile.txt
localhost
La belleza de Linux / Unix es que generalmente hay más de una forma de lograr algo. En el caso de la operación, hay al menos cuatro formas diferentes de extraer el nombre del servidor POP del archivo:
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 es bueno, pero solo si tienes espacios alrededor del=
. No funcionará paraPOP3_SERVER_NAME=localhost
.