¿Cómo mezclaría patrones y rangos numéricos en sed (o cualquier herramienta similar, awk por ejemplo)? Lo que quiero hacer es hacer coincidir ciertas líneas en un archivo y eliminar las siguientes n líneas antes de continuar, y quiero hacerlo como parte de una canalización.
105

+Npatrón es una extensión GNU. Cambie el primerona anNen su segundo ejemplo para que incluya la línea con el patrón./pattern/,+5define un rango, que comienza con una línea que contiene "patrón" (/pattern/) y termina 5 líneas después (+5). El último carácterdes un comando que se ejecuta en cada línea de ese rango, que es "eliminar". En la segunda receta, en lugar de hacer coincidir un rango, coincide solo en la línea que contiene el patrón (/pattern/) y luego ejecuta una serie de comandos:,{n;N;N;N;N;d}que básicamente imprime la siguiente línea (n) y luego lee y finalmente descarta las siguientes 4 líneas (N;N;N;N;d).sed -e '/pattern/{n;N;N;N;N;d;}' file.txtsomethinghaga:,sed -E '/^something$/,$d'donde-Ees la expresión regular extendida de portabilidad POSIX.Sin extensiones GNU (por ejemplo, en macOS):
Para eliminar 5 líneas después de un patrón (incluida la línea con el patrón)
Agregar
-i ''para editar en el lugar.fuente
awkSoluciones sencillas :Suponga que la expresión regular que se utilizará para encontrar líneas coincidentes se almacena en la variable de shell
$regexy el recuento de líneas para saltar$count.Si también se debe omitir la línea coincidente (
$count + 1se omiten las líneas):Si la línea coincidente no debe omitirse (se omiten las
$countlíneas posteriores a la coincidencia):Explicación:
-v regex="$regex" -v count="$count"defineawkvariables basadas en variables de shell del mismo nombre.$0 ~ regexcoincide con la línea de interés{ skip=count; next }inicializa el recuento de saltos y pasa a la siguiente línea, saltando efectivamente la línea correspondiente; en la segunda solución, losprintantesnextasegura que es no saltarse.--skip >= 0disminuye el número de saltos y actúa si es (todavía)> = 0, lo que implica que la línea en cuestión debe omitirse.{ next }pasa a la siguiente línea, saltándose efectivamente la línea actual1es una abreviatura de uso común para{ print }; es decir, la línea actual simplemente se imprime1es equivalente a{ print }es que1se interpreta como un patrón booleano que por definición siempre se evalúa como verdadero, lo que significa que su acción asociada (bloque) se ejecuta incondicionalmente. Dado que no hay ninguna acción asociada en este caso, el valorawkpredeterminado es imprimir la línea.fuente
Esto podría funcionar para ti:
fuente
pattern_number.txtes un archivo de 2 columnas que contiene el patrón que debe coincidir en la 1ª columna y en la 2ª el número de líneas que se deben omitir. El primersedcomando transforma el archivo en unsedscript que realiza la correspondiente coincidencia y omisión; ese script se proporciona a través de-fy stdin (-) al segundosedcomando. El segundosedcomando opera en un archivo de entrada ad-hoc de muestra formado a partir de la salida deseq 21para demostrar que funciona.Usando Perl
fuente
Esta solución le permite pasar "n" como parámetro y leerá sus patrones desde un archivo:
El archivo llamado "-" significa stdin para awk, por lo que es adecuado para su canalización
fuente