¿Cómo usaría sed para eliminar todas las líneas en un archivo de texto que contiene una cadena específica?
shell
sed
text-parsing
in-place
Una Naranja Mecánica
fuente
fuente
sed '/pattern to match/d' ./infile > ./newfile
o si desea hacer una edición en el lugar, puede agregar la-i
bandera a sed como ensed -i '/pattern to match/d' ./infile
. Tenga en cuenta que la-i
bandera requiere GNU sed y no es portátilsed -i.backup '/pattern to match/d' ./infile
. ej. ) Eso me ayudó con las ediciones in situ.sed
a ningún archivo que no esté controlado por la versión.sed -i '' '/pattern/d' ./infile
.Hay muchas otras formas de eliminar líneas con una cadena específica además de
sed
:AWK
Rubí (1.9+)
Perl
Shell (bash 3.2 y posterior)
GNU grep
Y, por supuesto
sed
(imprimir el inverso es más rápido que la eliminación real):fuente
sed
ejemplo tiene un comportamiento diferente, solo greps! Debería ser algo asísed -n -i '/pattern/!p' file
.grep -v "pattern" file > temp; mv temp file
esto podría aplicarse a algunos de los otros ejemplos dependiendo del valor de retorno.seq -f %f 10000000 >foo.txt
. sed d:time sed -i '' '/6543210/d' foo.txt
real 0m9.294s. sed! p:time sed -i '' -n '/6543210/!p' foo.txt
real 0m13.671s. (Para archivos más pequeños, la diferencia es mayor.)Puede usar sed para reemplazar las líneas en su lugar en un archivo. Sin embargo, parece ser mucho más lento que usar grep para el inverso en un segundo archivo y luego mover el segundo archivo sobre el original.
p.ej
o
El primer comando tarda 3 veces más en mi máquina de todos modos.
fuente
sed '/pattern/d' filename > filename2; mv filename2 filename
La forma fácil de hacerlo, con GNU
sed
:fuente
-r
opción (o-E
, dependiendo de su versión). Esto permite el uso de metacaracteres de expresiones regulares+
,?
,{...}
y(...)
.Puede considerar usar
ex
(que es un editor estándar basado en comandos de Unix):dónde:
+
se ejecuta dado el comando Ex (man ex
), igual que el-c
que se ejecutawq
(escribir y salir)g/match/d
- Ex comando para eliminar líneas con dadomatch
, ver: Poder de gEl ejemplo anterior es un método compatible con POSIX para editar in situ un archivo según esta publicación en las especificaciones
ex
Unix.SE y POSIX para .La diferencia con
sed
es que:A menos que disfrute de código no portable, sobrecarga de E / S y algunos otros efectos secundarios negativos. Básicamente, algunos parámetros (como in-place /
-i
) son extensiones de FreeBSD no estándar y pueden no estar disponibles en otros sistemas operativos.fuente
man ex
me da el hombre paravim
, al parecerex
es parte de vim ... si he entendido bien que mediante la sintaxis de patrón paramatch
es vimregex.com que es similar pero diferente a los sabores POSIX y PCRE?:g
es un comando compatible con POSIX con algunas pequeñas diferencias . Supongo que PCRE se basó en ello.Estaba luchando con esto en Mac. Además, necesitaba hacerlo usando un reemplazo variable.
Entonces usé:
sed -i '' "/$pattern/d" $file
donde
$file
es el archivo donde se necesita la eliminación y$pattern
es el patrón que debe coincidir para la eliminación.Elegí el
''
de este comentario .Lo que hay que tener en cuenta es el uso de comillas dobles en
"/$pattern/d"
. La variable no funcionará cuando usemos comillas simples.fuente
sed
requiere un parámetro después-i
, por lo que si no desea una copia de seguridad, aún debe agregar una cadena vacía:-i ''
sed -i "/$pattern/d" $file
. Gracias por su respuesta.Hice un pequeño punto de referencia con un archivo que contiene aproximadamente 345 000 líneas. El camino con
grep
parece ser alrededor de 15 veces más rápido que elsed
método en este caso.He intentado con y sin la configuración LC_ALL = C, no parece cambiar los tiempos significativamente. La cadena de búsqueda (CDGA_00004.pdbqt.gz.tar) está en algún lugar en el medio del archivo.
Aquí están los comandos y los tiempos:
fuente
También puedes usar esto:
Aquí
-v
se imprimirá solo que no sea su patrón (eso significa invertir coincidencia).fuente
Para obtener un resultado similar con
grep
usted, puede hacer esto:fuente
bash
shell o similar (notcsh
).SED:
'/James\|John/d'
-n '/James\|John/!p'
AWK:
'!/James|John/'
/James|John/ {next;} {print}
GREP:
-v 'James\|John'
fuente
El primer comando edita los archivos in situ (-i).
El segundo comando hace lo mismo pero mantiene una copia o una copia de seguridad de los archivos originales agregando .bk a los nombres de archivo (.bk se puede cambiar a cualquier cosa).
fuente
echo -e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt
fuente
En caso de que alguien quiera hacerlo para coincidencias exactas de cadenas, puede usar la
-w
bandera en grep - w para todo. Es decir, por ejemplo, si desea eliminar las líneas que tienen el número 11, pero mantener las líneas con el número 111:También funciona con la
-f
bandera si desea excluir varios patrones exactos a la vez. Si "lista negra" es un archivo con varios patrones en cada línea que desea eliminar del "archivo":fuente
-w, --word-regexp Select only those lines containing matches that form whole words.
vs.-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
fuente
para mostrar el texto tratado en la consola
para guardar el texto tratado en un archivo
para agregar información de texto tratado a un archivo existente
para tratar el texto ya tratado, en este caso, elimine más líneas de lo que se ha eliminado
el
| more
mostrará texto en fragmentos de una página a la vez.fuente
Puede usar good old
ed
para editar un archivo de manera similar a la respuesta que usaex
. La gran diferencia en este caso es queed
toma sus comandos a través de una entrada estándar, no como argumentos de línea de comandos comoex
puede. Cuando se usa en un script, la forma habitual de acomodar esto es usarprintf
comandos de canalización:o con un heredoc:
fuente