El archivo de entrada1 es:
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Le doy al partido el patrón desde adentro other file
(como dog 123 4335
desde file2).
Coincido con el patrón de la línea dog 123 4335
y después de imprimir todas las líneas sin una línea coincidente, mi salida es:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Si solo se usa sin dirección de línea, solo se usa el patrón, por ejemplo, 1s
¿cómo hacer coincidir e imprimir las líneas?
text-processing
sed
grep
loganaayahee
fuente
fuente
Respuestas:
Suponiendo que desea hacer coincidir la línea completa con su patrón, con GNU
sed
, esto funciona:Equivalente estándar:
Con la siguiente entrada (
infile
):El resultado es:
Explicación:
/^dog 123 4335$/
busca el patrón deseado.:a; n; p; ba;
es un bucle que recupera una nueva línea desde input (n
), la imprime (p
) y vuelve a ramificarse para etiquetar a:a; ...; ba;
.Actualizar
Aquí hay una respuesta que se acerca más a sus necesidades, es decir, patrón en el archivo2, grepping del archivo1:
El grep y el corte incrustados encuentran la primera línea que contiene un patrón del archivo2, este número de línea más uno se pasa a la cola, el más está allí para omitir la línea con el patrón.
Si desea comenzar desde el último partido en lugar del primer partido, sería:
Tenga en cuenta que no todas las versiones de tail admiten la notación más.
fuente
sed -n '/^dog 123 4335$/ { :a; p; n; ba; }' infile
(con el p y n conmutado) incluye con éxito la línea que coincide también.Si tiene un archivo razonablemente corto
grep
solo podría funcionar:5000 es solo mi suposición en "razonablemente corto", ya que
grep
encuentra la primera coincidencia y la genera junto con las siguientes 5000 líneas (el archivo no necesita tener tantos). Si no quieres el partido en sí, deberás cortarlo, por ejemploSi no desea la primera, pero la última coincidencia como delimitador, puede usar esto:
Esta línea lee
animals.txt
en orden inverso a las líneas y emite hasta e incluyendo la línea condog 123 4335
y luego se invierte nuevamente para restaurar el orden correcto.Nuevamente, si no necesita la coincidencia en el resultado, agregue cola. (También podría complicar la expresión sed para descartar su búfer antes de salir).
fuente
En la práctica, probablemente usaría la respuesta de Aet3miirah la mayor parte del tiempo y la respuesta de alexey es maravillosa cuando quiero navegar a través de las líneas (también, también funciona con
less
). OTOH, realmente me gusta otro enfoque (que es una especie de respuesta inversa de Gilles :Cuando se llama con el
-n
indicador,sed
ya no imprime las líneas que procesa. Luego usamos un formulario de 2 direcciones que dice que se aplique un comando desde la línea que coincide/dog 123 4335/
hasta el final del archivo (representado por$
). El comando en cuestión esp
, que imprime la línea actual. Entonces, esto significa "imprimir todas las líneas desde la que coincida/dog 123 4335/
hasta el final".fuente
dog
embargo, eso imprime la línea que no se desea aquí.sed -n '/dog 123 4335/,$p' | tail -n +2
eliminará el partido tambiénSi necesita leer el patrón de un archivo, sustitúyalo en el comando sed. Si el archivo contiene un patrón sed:
Si el archivo contiene una cadena literal para buscar, cita todos los caracteres especiales. Supongo que el archivo contiene una sola línea.
Si desea que la coincidencia sea toda la línea, no solo una subcadena, ajuste el patrón
^…$
.fuente
sed
tiene0,/dog.../d
para eso.$ more +/"dog 123 4335" file1
fuente
less
.tac
.+
fue reemplazado por-p
POSIX 7: pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html pero aún no se implementó en util-linux 2.20.1. Y esto también imprimeskipping..
y algunas nuevas líneas adicionales (para stderr, espero, por lo que podría estar bien).Con
awk
:fuente
Una forma de usar awk:
donde file2 contiene sus patrones de búsqueda. Primero, todo el contenido del archivo2 se almacena en la matriz "a". Cuando se procesa el archivo1, cada línea se compara con la matriz y se imprime solo si no está presente.
fuente
Si la entrada es un archivo regular que se puede buscar :
Con GNU
grep
:Con
sed
:Un GNU
grep
llamado w / la-m
opción dejará la entrada en la coincidencia, y dejará su entrada (posible) fd inmediatamente después del punto en que encontró su última coincidencia. Entonces, llamar agrep
w /-m1
encuentra la primera aparición de un patrón en un archivo, y deja el desplazamiento de entrada exactamente en el lugar correcto paracat
escribir todo después de la primera coincidencia del patrón en un archivo para stdout.Incluso sin un GNU
grep
, puede hacer exactamente lo mismo con un POSIX compatiblesed
: cuandosed
q
se especifica, deja su desplazamiento de entrada justo donde lo hace. Sinsed
embargo, GNU no cumple con los estándares de esta manera, por lo que lo anterior probablemente no funcionará con un GNU ased
menos que lo llame con su-u
interruptor.fuente
sed
transmisión compartida que se muestra aquí no es especialmente (aunque sí, el estándar al que se hace referencia específicamente ejemplificased
como una utilidad así capaz) del flujo de trabajo de forma libre y condicionalmente cooperativo que se muestra. en particular, todas las utilidades estándar están diseñadas y especificadas para cooperar y compartir las posiciones del cursor de las secuencias de entrada sin que el siguiente lector falle en el procesamiento.grep -q
debería hacer esto; silenciosamentegrep
debería regresar tan pronto como se encuentre una coincidencia en la entrada, y cualquier resto de entrada no debería, por norma, ser consumido por defecto.Mi respuesta a la pregunta en el tema, sin almacenar el patrón en un segundo archivo. Aquí está mi archivo de prueba:
GNU sed:
Perl:
Variante de Perl con patrón en un archivo:
fuente
Wth
ed
:Esto envía un
p
comando rint a ed en una cadena aquí; el comando de impresión está limitado en rango a uno después (+1
) de ladog 123 4335
coincidencia hasta el final del archivo ($
).fuente
Si no le importa la creación de un archivo temporal y lo tiene
csplit
disponible, esto funciona:Note
file1
es el archivo de entrada yfile2
es el archivo de patrón (como se indica en la pregunta).La forma larga del comando anterior es:
es decir,
csplit
sin laprefix
bandera de arriba crearía el archivoxx00
(siendo el prefijoxx
y el sufijo00
). Con la bandera de arriba crea el archivofile1_00
. Sin laquiet
bandera, imprime el tamaño del archivo de salida (tamaño del archivo resultante).fuente
Dado que awk no está expresamente rechazado, esta es mi oferta asumiendo que 'gato' es la pareja.
fuente
Otra forma de decirlo es "cómo eliminar todas las líneas desde la primera hasta el partido (incluido)", y esto se puede
sed
escribir como:fuente
sed -e '0,/MATCH PATTERN/d'
entonces?