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
PATTERNen1stlínea consigo mismo.edproducirá 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
qfunciona si la primera línea no!coincide ( )PATTERN, de lo contrariopborra todas las líneas.O, como lo señaló Toby Speight , con GNU
sed:Qes lo mismoqpero no imprime el espacio del patrón.fuente
Qlugar deqGNU sed, odantesq(portátil) para no requerir la-nbandera y elpcomando:sed '1{/PATTERN/!Q}' infileosed -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile, respectivamente.dreinicia el ciclo de comando ¡ Eso siempre me atrapa! : - |sedel primersedcomando se quejased: -e expression #1, char 10: extra characters after command(debido ap), pero lasedúltimassedsugerencias funcionan bien.sed -n '1{/PATTERN/!q};p'Con el cofre de herramientas POSIX:
fuente
imprimiría el nombre de los
txtarchivos no ocultos en el directorio actual cuya primera línea coincide con la expresión regular extendidapatterncon aquellasawkimplementaciones 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
awkal 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
awkpara imprimir la lista de archivos que coinciden (delimitados por 0) y se confía encatvolcar su contenido.fuente
Si está escribiendo un script de shell, podría hacer algo como
O, en Perl:
fuente
close ARGVsea 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/elselugar de[ ] &&.