Supongamos que hay un comando como:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
La salida es como tal:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Ahora, mi pregunta es: ¿Hay algún comando que solo imprima lo que está dentro de las comillas, es decir " ",?
¿Y podría explicar un poco el comando? ¡Gracias! por adelantado.
command-line
text-processing
Rafael
fuente
fuente

caten cuenta que usarlo en una tubería es casi siempre un desperdicio de recursos (AKA UUOC );greppuede leer su entrada de un archivo ya (es decir,grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generichace exactamente lo mismo, pero 1. Es más corto 2. Es más fácil de entender 3. No bifurca un shell adicional y un proceso adicional). En el 99% de los casos, usar cat al comienzo de la tubería sin concatenar múltiples archivos es simplemente dañino. :)cat, aunque inútil en este caso, facilitaría la edición de toda la línea de comandos en el futuro en caso de que desee cambiar / agregar / eliminar algo más tarde, tal vez atrocut, etc., no tenga que buscar y mover el nombre de archivo , asegúrese de que el otro comando lo admita, busque dónde colocarlo, etc. Y para un pequeño archivo de prueba solo agrega 0.002s. (Probablemente he pasado más tiempo escribiendo esto de lo que ahorraré en toda una vida evitando lo superfluocat)catayuda aquí? Puedes hacerlogrep foo file | tro... | cuttan fácilmente comocat file | tr | grep .... Elcatsolo agrega cinco caracteres adicionales, una tubería adicional y una llamada de programa adicional y no simplifica nada.Respuestas:
Si tu puedes hacerlo. Tu comando sería:
que solo devolvería:
El
awkcomando usa separadores de campo con el-Fcomando, y para configurarlo para usar comillas dobles, lo escribe con comillas simples alrededor-F'"'. Luego,'{print $2}'le dice a awk que imprima el segundo conjunto después del separador de campo.¡Espero que esto ayude!
fuente
catygrep. Podrías reemplazarcaty partirgrepconawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic. Menos fontanería, dejando que AWK haga todo el trabajo, que es más que capaz de hacerawkcomando. =)Puedes hacerlo con un solo
grepcomando:O (un poco más largo y más convulsionado):
-P: le dicegrepque interprete el patrón como PCRE (expresión regular compatible con Perl);-o: le dicegrepque imprima solo la coincidencia;^CONFIG_ARCH_DEFCONFIG=": coincide con unaCONFIG_ARCH_DEFCONFIG="cadena al comienzo de la línea;\K: descarta la subcadena previamente coincidente;# 1:
[^"]*: coincide con cualquier número de cualquier carácter que no sea"(con avidez).# 2:
.*?: coincide con cualquier número de cualquier personaje (perezosamente);(?="): lookahead (aserción de longitud cero, no coincide con ningún carácter); coincide si el siguiente carácter es a".fuente
Hay muchas maneras de desollar a este gato, aquí hay una
sedmanera:Aquí estamos haciendo coincidir la línea y capturando la porción deseada, es decir, la porción entre comillas dobles (
([^"]+)) y luego reemplazando toda la línea con el grupo capturado (\1) solamente.Ejemplo:
fuente
Qué, no hay
perl?El
perlse-print cada línea después de aplicar la secuencia de comandos dada por-e. Las/foo/bar/sustituiráfooconbar. Los patrones entre paréntesis se "capturan" y pueden denominarse$1,$2...$Ndonde$1se captura el primer patrón,$2el segundo, etc. La expresión regular buscará todo hasta la primera cita (.*?"), luego capturará 0 o más"caracteres que no sean caracteres. ([^"]*) y luego todo lo demás. Todo se reemplaza con el patrón capturado.También puede dejar que el patrón coincida con
perl:fuente
with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]Aquí hay una combinación de
grepycut, que hace el mismo trabajo.Explicación:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generices la parte que se encuentra la línea, en la sintaxis estándar grep:grep [OPTIONS] PATTERN [FILE...]. La salida pasa por la tubería a la siguiente etapa.cut -d"\"" -f2. Esta parte utiliza texto cortado a recortado separado por un delimitador específico (que se especifica con una-dmarca). Tenemos que escapar de la comilla doble con barra invertida para que el shell permita tomar comillas dobles como una de las opciones delcutcomando, en lugar de ingresarlo en el shell. Ahoracutva a tratar de salida degrepcomo separadas por"y se dividió en tres columnas,CONFIG_ARCH_DEFCONFIG,arch/x86/configs/x86_64_defconfig, y el espacio vacío. La línea que necesitamos es la segunda columna, lo que significa que necesitamos usar-f2flag.fuente
Como actualmente estoy aprendiendo
pythonaquí, hay una versión que usa exactamente eso.Ejecución de muestra:
fuente
line.startswithporquere.matches mucho más lento questartswith