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 -i
switch di sed
:
sed -i.bak '/^HERE IT IS/d' <file>
Il file originale rimarrà come <file>.bak
e 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 grep
e sed
alle 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' -i
opzione 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 awk
su 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
bash
quello 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.py
e 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
vim
cosìvim '+g/^HERE IT IS/d' +wq test.txt