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 -iinterruptor de sed:
sed -i.bak '/^HERE IT IS/d' <file>
El archivo original permanecerá como <file>.baky 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 grepy las sedrespuestas 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 -iinterruptor 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 awken 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
bashme 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.pyy 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
vimasívim '+g/^HERE IT IS/d' +wq test.txt