¿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
+N
patrón es una extensión GNU. Cambie el primeron
a anN
en su segundo ejemplo para que incluya la línea con el patrón./pattern/,+5
define un rango, que comienza con una línea que contiene "patrón" (/pattern/
) y termina 5 líneas después (+5
). El último carácterd
es 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.txt
something
haga:,sed -E '/^something$/,$d'
donde-E
es 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
awk
Soluciones sencillas :Suponga que la expresión regular que se utilizará para encontrar líneas coincidentes se almacena en la variable de shell
$regex
y el recuento de líneas para saltar$count
.Si también se debe omitir la línea coincidente (
$count + 1
se omiten las líneas):Si la línea coincidente no debe omitirse (se omiten las
$count
líneas posteriores a la coincidencia):Explicación:
-v regex="$regex" -v count="$count"
defineawk
variables basadas en variables de shell del mismo nombre.$0 ~ regex
coincide 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, losprint
antesnext
asegura que es no saltarse.--skip >= 0
disminuye 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 actual1
es una abreviatura de uso común para{ print }
; es decir, la línea actual simplemente se imprime1
es equivalente a{ print }
es que1
se 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 valorawk
predeterminado es imprimir la línea.fuente
Esto podría funcionar para ti:
fuente
pattern_number.txt
es 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 primersed
comando transforma el archivo en unsed
script que realiza la correspondiente coincidencia y omisión; ese script se proporciona a través de-f
y stdin (-
) al segundosed
comando. El segundosed
comando opera en un archivo de entrada ad-hoc de muestra formado a partir de la salida deseq 21
para 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