En un archivo con muchas líneas, quiero eliminar las líneas que comienzan con HERE IT IS
.
¿Cómo puedo hacer esto usando solo herramientas de línea de comandos?
En un archivo con muchas líneas, quiero eliminar las líneas que comienzan con HERE IT IS
.
¿Cómo puedo hacer esto usando solo herramientas de línea de comandos?
Respuestas:
Prueba sed
:
sed -i '/^HERE IT IS/d' <file>
ADVERTENCIA: es mejor hacer una copia de seguridad cuando se usa el -i
interruptor de sed
:
sed -i.bak '/^HERE IT IS/d' <file>
El archivo original permanecerá como <file>.bak
y el archivo modificado será <file>
.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
.
Además de los muy buenos grep
y las sed
respuestas que ha recibido, aquí hay algunas otras herramientas que pueden hacer lo mismo:
Algunas formas de Perl:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
Puede agregar el -i
interruptor a cualquiera de los ejemplos para editar el archivo en su lugar:
perl -i.bak -ne '/^HERE IT IS/ || print' file
(papar moscas
awk '!/^HERE IT IS/' file > newfile
Las versiones más recientes (4.1.1 y posteriores) de GNU awk
(el valor predeterminado awk
en Linux) también pueden editar el archivo en su lugar:
gawk -i inplace '!/^HERE IT IS/' file
Shell ( bash
, zsh
, ksh
, y probablemente otros). Sin embargo, esto es un poco tonto, se puede hacer, pero otras herramientas son mejores.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
me hizo LOL)
printf "%s\n" "$line"
: citando $ line para preservar espacios en blanco y evitando algunos problemas de eco (interpretación de caracteres especiales, etc.). y evita la necesidad de agregar --
también.
IFS=
y -r
, también podría ir hasta el final y hacerlo robusto.
sed
Definitivamente es el camino a seguir.
Esta ligera modificación del comando que le dio @heemayl eliminará la línea, ya sea que se use el mismo caso en el patrón o no, debido a la I en la referencia del patrón.
sed -i '/HERE IT IS/Id' <file>
Si tenía varios archivos en un directorio en el que deseaba hacer esto, podría combinarlo con buscar así.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
La opción maxdepth significa que esto no se repetirá en los directorios.
Otra opción de python:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Donde f es la ruta al archivo, entre comillas.
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
aserción negativa anticipada que hace que el motor de expresiones regulares coincida con todos los límites de inicio de línea ( que generalmente coinciden^
) solo si no es seguido por la cadenaHERE IT IS
pitón
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
Guarde el script en un archivo, dígalo script.py
y luego ejecútelo a través del siguiente comando en el terminal.
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, pero no es mucho más eficiente que startswith
. Me preguntaba cómo [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
no produciría la salida en una lista.
Puede usar Vim en modo Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g
búsqueda global
d
Eliminar
x
guardar y cerrar
vim
asívim '+g/^HERE IT IS/d' +wq test.txt