Mai mult
Șterge linii într-un fișier text care conțin un anumit șir
Cum mi-ar folosi sed pentru a șterge toate liniile într-un fișier text care conțin un anumit șir de caractere?
1652
14
Pentru a elimina line și de imprimare de ieșire standard de ieșire:
Pentru a modifica direct la fișier – nu funcționează cu BSD sed:
Același lucru, dar pentru BSD sed (Mac OS X și FreeBSD) – nu funcționează cu GNU sed:
Pentru a modifica direct fișierul (și de a crea o copie de rezervă) – funcționează cu BSD și GNU sed:
Există multe alte moduri de a șterge linii cu specific șir în afară de
sed
:AWK
Ruby (1.9+)
Perl
Shell (bash 3.2 și mai târziu)
GNU grep
Și, desigur,
sed
(imprimare inversă este mai rapid decât ștergerea reală):Puteți utiliza sed să înlocuiască linii în loc într-un fișier. Cu toate acestea, se pare a fi mult mai lent decât folosind grep pentru inversul într-un al doilea fișier și apoi se deplasează de-al doilea dosar în original.
de exemplu
sau
Prima comandă are de 3 ori mai mult pe masina mea oricum.
Cea mai ușoară cale de a face asta, cu GNU
sed
:Puteți lua în considerare, folosind
ex
(care este un standard de comandă Unix-based editor):în cazul în care:
+
execută dat Ex de comandă (bărbat ex), la fel ca "- c " care execută
wq` (scrie si renuntat)g/meci/d
- Ex de comandă pentru a șterge linii cu date de "meci", a se vedea: Putere de gExemplul de mai sus este un POSIX compatibile metodă în loc de editare a unui fișier ca pe acest post la Unix.SE și POSIX specificațiile pentru
ex
.Diferența cu
sed
este asta:Dacă vă bucura de unportable cod, I/O de regie și alte efecte secundare rele. Deci, practic unii parametri (cum ar fi în-loc/i
-i
) sunt non-standard FreeBSD extensii și pot să nu fie disponibile pe alte sisteme de operare.Am fost lupta cu acest lucru pe Mac. În Plus, am nevoie sa o fac folosind variabila de înlocuire.
Așa că am folosit:
sed -am '' "/$model/d" $file
unde
$de fișier este fișierul în care eliminarea este necesară și
$model este modelul pentru a fi potrivite pentru ștergere.Am ales
''
din acest comentariu.Lucru de reținut aici este utilizarea de ghilimele duble în"/$model/d"`. Variabila a câștigat't de lucru atunci când vom folosi ghilimele simple.
Am facut un mic benchmark cu un fișier care conține aproximativ 345 000 de linii. La fel cu
grep
pare a fi în jurul valorii de 15 ori mai repede decâtsed
metodă în acest caz.Am încercat atât cu, cât și fără stabilirea LC_ALL=C, nu pare a modifica timpii de semnificativ. Șirul de căutare (CDGA_00004.pdbqt.gz.tar) este undeva la mijloc de fișier.
Aici sunt comenzile și timpii:
Puteți folosi, de asemenea, acest lucru:
Aici
-v
va imprima numai, altele decât modelul (care înseamnă invertit meci).Pentru a obține un efectivă ca urmare cu
grep
puteți face acest lucru:SED:
'/James\|John/d'
-n '/James\|John/!p'
AWK:
'!/James|John/'
/James|John/ {next;} {print}
GREP:
-v 'James\|John'
Prima comanda editează fișierul(e) efectivă (-i).
Cea de-a doua comanda face acelasi lucru, dar păstrează o copie sau o copie de rezervă a fișierului original(e) prin adăugarea .bk la nume de fișiere (.bk poate fi schimbat pentru nimic).
echo-e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt
Doar în cazul în care cineva vrea să-l facă pentru potriviri exacte de siruri de caractere, puteți utiliza
-w
pavilion în grep - w pentru tot. Asta este, de exemplu, dacă doriți să ștergeți liniile care au numărul 11, dar păstrează liniile cu număr de 111:De asemenea, funcționează cu
-f
flag dacă doriți să excludeți mai multe exactă modele la o dată. Dacă "lista neagra" este un fișier cu mai multe modele pe fiecare linie pe care doriți să-l ștergeți din "fișier":