In un file con molte righe voglio eliminare le righe che iniziano con HERE IT IS.
Come posso farlo usando solo gli strumenti da riga di comando?
In un file con molte righe voglio eliminare le righe che iniziano con HERE IT IS.
Come posso farlo usando solo gli strumenti da riga di comando?
Risposte:
Prova sed:
sed -i '/^HERE IT IS/d' <file>
ATTENZIONE: è meglio eseguire un backup quando si utilizza -iswitch di sed:
sed -i.bak '/^HERE IT IS/d' <file>
Il file originale rimarrà come <file>.bake il file modificato sarà <file>.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file.
Oltre all'ottimo grepe sedalle risposte che hai ricevuto, ecco alcuni altri strumenti che possono fare la stessa cosa:
Alcuni modi 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
È possibile aggiungere l' -iopzione a uno qualsiasi degli esempi per modificare il file in atto:
perl -i.bak -ne '/^HERE IT IS/ || print' file
(G) awk
awk '!/^HERE IT IS/' file > newfile
Le versioni più recenti (4.1.1 e successive) di GNU awk(impostazione predefinita awksu Linux) possono anche modificare il file in atto:
gawk -i inplace '!/^HERE IT IS/' file
Shell ( bash, zsh, ksh, probabilmente altri). Questo è un po 'sciocco, può essere fatto, ma altri strumenti sono migliori.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bashquello mi ha fatto LOL)
printf "%s\n" "$line": quotando $ line per preservare gli spazi bianchi, ed evitando alcuni problemi di eco (interpretando caratteri speciali, ecc.). ed evita anche la necessità di aggiungere --.
IFS=e -r, potrei anche andare fino in fondo e renderlo robusto.
sed è sicuramente la strada da percorrere.
Questa leggera modifica del comando fornito da @heemayl eliminerà la riga indipendentemente dal fatto che lo stesso caso venga utilizzato nel modello o meno, a causa di I nel riferimento del modello.
sed -i '/HERE IT IS/Id' <file>
Se avessi diversi file in una directory su cui volevi farlo, potresti combinarli con find in questo modo.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
L'opzione maxdepth significa che questo non verrà utilizzato nelle directory.
Un'altra opzione Python:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Dove f è il percorso del file, tra virgolette.
grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)asserzione lookahead negativa che fa corrispondere al motore regex tutto il limite iniziale della linea ( che di solito è abbinato^ ) solo se non è seguito dalla stringaHERE IT IS
pitone
#!/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="")
Salvare lo script in un file, dire script.pye quindi eseguirlo tramite il comando seguente sul terminale.
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)], ma non è molto più efficiente di startswith. Mi chiedevo come [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]non produrre l'output in un elenco.
Puoi usare Vim in modalità Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g ricerca globale
d Elimina
x salva e chiudi
vimcosìvim '+g/^HERE IT IS/d' +wq test.txt