Tengo salida de VBoxManage list vms
que se ve así:
"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}
Tengo que agarrar los nombres arch
y arch2
y guardarlos en una variable.
fuente
Tengo salida de VBoxManage list vms
que se ve así:
"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}
Tengo que agarrar los nombres arch
y arch2
y guardarlos en una variable.
Esto analizará el contenido de esas 2 cadenas:
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
Lo anterior busca una cadena que coincida con el patrón ".*"
. Eso coincidirá con cualquier cosa que ocurra entre comillas dobles. Entonces grep
devolverá este tipo de valores:
"arch"
"arch2"
La canalización sed
eliminará las comillas dobles de estas cadenas para darle las cadenas que está buscando. La notación sed 's/"//g'
está instruyendo a sed
hacer una búsqueda y reemplazo en todas las apariciones de comillas dobles, sustituyéndolas con nada, s/"//g
. El comando s/find/replace/g
es lo que está sucediendo allí, y el seguimiento g
de la búsqueda le dice que lo haga globalmente en toda la cadena que se le da.
También puede usar sed
para cortar la comilla doble inicial, mantener lo que hay entre ellas y cortar la comilla restante + todo lo que está después:
$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
El comando tr
se puede usar para eliminar caracteres. En este caso, se eliminan las comillas dobles.
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
Con grep
la función PCRE, puede buscar cualquier subcadena que comience con una comilla doble o termine con una comilla doble e informe solo la subcadena.
tr -d \"
Es otra forma de eliminar las comillas. (tr
normalmente traduce un conjunto de caracteres en otro;-d
le dice que simplemente los elimine en su lugar)./address/
alsed
igual quesed '/^"\(arch[^"]*\)/s//\1/
usted sólo opera en las líneas que contienen esa cadena.sed
realmente debería hacerlos/^"\([^"]*\)".*/\1/
solo en caso de que solo haya dos comillas dobles en la línea.Ese es otro trabajo para
cut
:fuente
cut
divide cada línea en campos usando la comilla como delimitador, luego genera el campo 2: el campo 1 es la cadena vacía antes de la primera cita, el campo 2 es la cadena deseada entre las comillas y el campo 3 es el resto del línea.Con
sed
usted puede hacer:Explicación:
s/.../.../
- emparejar y reemplazar^
- partido al inicio de la línea\(...\)
- esta es una referencia inversa, podemos referirnos a lo que coincide aquí más adelante con\1
[^"]*
- coincide con cualquier secuencia que no contenga un"
(es decir, hasta el siguiente"
).*
- coincide con el resto de la línea\1
- reemplazar con la referencia posteriorO con
awk
:Tenga en cuenta que en los shells modernos también puede usar una matriz en lugar de una variable normal. En
bash
puedes hacer:Esto podría ser más fácil cuando utilizas la variable.
fuente
Usando bash, escribiría:
fuente
Y el de grep oneliner con
--perl-regexp
opción,Explicación:
(?<=^\")[^"]*
-> Aquí se usa un lookbehind. Coincide con cualquier carácter pero no"
cero o más veces (una vez que encuentra comillas dobles, deja de coincidir) que están justo después de las comillas dobles (solo la línea que comienza con comillas dobles).Otro truco feo
sed
,fuente
Dado que regex tiene modos codiciosos y no codiciosos, si tiene múltiples objetivos en la misma línea, no se extraerá como desee. Línea:
Objetivo:
Comando (modo codicioso):
Comando (modo no codicioso):
fuente