creo que lo que estás buscando es sed
... es un s TREAM ed itor, que le permita realizar reemplazos en una base de línea por línea.
Como lo está explicando, el comando `cat named.local | zona grep' le da una salida un poco como esto:
zone "domain1.tld" {
zone "domain2.tld" {
zone "domain3.tld" {
zone "domain4.tld" {
supongo que desea que la salida sea algo como esto, ya que dijo que necesita el texto entre comillas dobles:
"domain1.tld"
"domain2.tld"
"domain3.tld"
"domain4.tld"
Entonces, en realidad, desde cada línea solo queremos el texto entre las comillas dobles (incluidas las comillas dobles)
No estoy seguro de que esté familiarizado con Regular Expressions, pero son una herramienta invaluable para cualquier persona que escriba scripts de shell. Por ejemplo, la expresión regular /.o.e/
coincidiría con cualquier línea donde haya una palabra con la segunda letra en minúsculas o
, y la 4ª era e
. Esto coincidiría con palabras cadena que contiene como "zone
", "tone
", o incluso "I am tone-deaf.
"
El truco que había que utilizar el carácter .
(punto) en el sentido de "cualquier letra". Hay un par de otros caracteres especiales, como *
que significa "repetir el carácter anterior 0 o más veces". Por lo tanto una expresión regular como a*
coincidiría "a
", "aaaaaaa
", o una cadena vacía: ""
para que pueda coincidir la cadena dentro de las comillas usando: /".*"/
Hay otra cosa que se sabe acerca sed
(y por los comentarios, ¡ya lo hace!) - permite retroceder. Una vez que le haya dicho cómo reconocer una palabra, puede hacer que use esa palabra como parte del reemplazo. Por ejemplo, digamos que usted quiere convertir esta lista:
Billy "The Kid" Smith
Jimmy "The Fish" Stuart
Chuck "The Man" Norris
En esta lista:
The Kid
The Fish
The Man
En primer lugar, se buscaría la cadena dentro de las comillas. Ya vimos que era /".*"/
.
A continuación, queremos utilizar lo que hay dentro de las comillas.Podemos grupo que utilizando parens: /"(.*)"/
Si quisiéramos reemplazar el texto con las comillas con un carácter de subrayado, nos gustaría hacer un reemplazo: s/"(.*)"/_/
, y que nos dejaría con:
Billy _ Smith
Jimmy _ Stuart
Chuck _ Norris
¡Pero hemos retrocedido! Eso nos permitirá recordar lo que estaba dentro de los parens, usando el símbolo \1
. Así que si hacemos ahora: s/"(.*)"/\1/
nos pondremos:
Billy The Kid Smith
Jimmy The Fish Stuart
Chuck The Man Norris
Debido a que las cotizaciones no estaban en los parens, que no formaban parte de los contenidos de \1
!
Para dejar solo el material dentro de las comillas dobles, debemos hacer coincidir toda la línea. (. Que significa "fin de línea") para hacer eso tenemos ^
(que significa "principio de la línea"), y $
Así que ahora si utilizamos s/^.*"(.*)".*$/\1/
, conseguiremos:
The Kid
The Fish
The Man
¿Por qué? Vamos a leer la expresión regular s/^.*"(.*)".*$/\1/
de izquierda a derecha:
En la llanura Inglés:. "Leer toda la línea, la copia a un lado el texto entre comillas dobles A continuación, reemplace la línea entera con el contenido entre las dobles qoutes."
Incluso se puede añadir de comillas dobles alrededor del texto reemplazando s/^.*"(.*)".*$/"\1"/
, por lo que obtendrá:
"The Kid"
"The Fish"
"The Man"
y que puede ser utilizado por sed
para reemplazar la línea con el contenido desde dentro de las comillas:
sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
(esto es sólo concha escapó para hacer frente a las comillas dobles y las barras y esas cosas.)
de modo que todo el comando wo ULD ser algo como:
cat named.local | grep zone | sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
Sí, lo estoy usando ahora, pero creo que debería haber una manera más fácil de hacerlo, porque ahora uso sed-e 's/zone "// g' | sed-e 's /" { // g 'para eliminar el comienzo y el final de un archivo en lugar de simplemente coincidir con el medio. – jpou
Afeitar el principio y el final es perfectamente aceptable. Esto no es competencia, si funciona, está bien. Si desea hacerlo haciendo coincidir el texto entre comillas, eche un vistazo a "captura de grupos". – zoul
ugh. Pasé demasiado tiempo tipeando eso, y todavía no está hecho ... parece que todos nos ganaron. Pero me alegra que ya lo hayas descifrado :-) – scraimer