Estoy escribiendo una secuencia de comandos, quiero verificar si la primera línea del archivo coincide con un cierto patrón y, si es así, imprimir el archivo. ¿Cómo puedo conseguir esto?
¿Cómo verifico el patrón? ¿Hay alguna manera de verificar el patrón y, en función de la salida, hacer algo?
EDITAR: Eche un vistazo a esta pregunta: /programming/5536018/how-to-get-match-regex-pattern-using-awk-from-file
Quiero algo como esto, pero ninguno de ellos funcionó para mí. Básicamente quiero verificar si la primera línea coincide con un patrón de expresión regular o no y, en función de eso, imprima las líneas del archivo.
Respuestas:
Podrías hacer eso con
ed
:El truco aquí es intentar reemplazar
PATTERN
en1st
línea consigo mismo.ed
producirá un error si no puede encontrar el patrón especificado, por lo que,p
(imprimir todo el archivo) solo se ejecutará si1s/PATTERN/&/
tiene éxito.O con
sed
:esto
q
funciona si la primera línea no!
coincide ( )PATTERN
, de lo contrariop
borra todas las líneas.O, como lo señaló Toby Speight , con GNU
sed
:Q
es lo mismoq
pero no imprime el espacio del patrón.fuente
Q
lugar deq
GNU sed, od
antesq
(portátil) para no requerir la-n
bandera y elp
comando:sed '1{/PATTERN/!Q}' infile
osed -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile
, respectivamente.d
reinicia el ciclo de comando ¡ Eso siempre me atrapa! : - |sed
el primersed
comando se quejased: -e expression #1, char 10: extra characters after command
(debido ap
), pero lased
últimassed
sugerencias funcionan bien.sed -n '1{/PATTERN/!q};p'
Con el cofre de herramientas POSIX:
fuente
imprimiría el nombre de los
txt
archivos no ocultos en el directorio actual cuya primera línea coincide con la expresión regular extendidapattern
con aquellasawk
implementaciones que admitennextfile
.Si en lugar de imprimir el nombre del archivo, desea imprimir todo el contenido del archivo, puede hacer lo siguiente:
Eso es eficiente porque solo ejecuta un comando, pero
awk
al no ser el comando más eficiente para volcar el contenido de un archivo, con archivos grandes, posiblemente podría obtener mejores rendimientos haciendo algo como:Es decir, solo se usa
awk
para imprimir la lista de archivos que coinciden (delimitados por 0) y se confía encat
volcar su contenido.fuente
Si está escribiendo un script de shell, podría hacer algo como
O, en Perl:
fuente
close ARGV
sea más idiomático que asignar$.
.Oldschool, solo traduce tu oración en comandos estándar:
Para aprender bash es un buen comienzo. Si solo necesita una solución rápida, pruebe las respuestas sed, awk o perl. Ambos son agradables, pero son idiomas propios que necesitas (y probablemente quieras) para aprender.
Es un ejemplo bastante simple, por lo que si desea obtener más información, también puede intentar lo mismo en ruby, php, js (por ejemplo, en nodejs) o en cualquier otro idioma que permita el acceso a archivos. Incluso C / C ++ o Java deberían ser fáciles de administrar con una tarea pequeña.
fuente
if/else
lugar de[ ] &&
.