Ricerca ed eliminazione di linee da tutti i file in modo ricorsivo


14

Sono riuscito a grep le occorrenze di una parola chiave utilizzando

grep "KeyWord" . -r -n -i -I 

ma le occorrenze di KeyWord sono troppo grandi. Voglio solo cancellare tutte le righe che contengono quella parola.

Ho cercato in giro, sed sembra essere l'utilità. Qualcuno può dirmi quale comando farebbe il trucco?

Grazie.

Risposte:


25

Con una GNU sed:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

Con un OSX sed:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

Il primo comando findtrova tutti i file standard (non directory, pipe o ecc.), Li stampa separati da \0(quindi i nomi dei file possono contenere spazi, newline, ecc.).

Il secondo comando xargslegge l'output di find, prende un elenco basato su un separatore (a \0causa di -0), invoca sed -i [...]con parametri aggiunti dall'elenco ( sedverrà chiamato più volte se ci sono molti file, poiché la lunghezza massima dei parametri è limitata in ogni invocazione).

Il sedcomando modifica sul posto ( -i).

Per quanto riguarda /KeyWord/d, eliminerà le righe contenenti l'espressione regolare KeyWord.

Dovresti imparare seda comprendere correttamente la sintassi (semplice ma insolita) e fare riferimento alle manpage appropriate per ulteriori informazioni sugli strumenti coinvolti qui.


E come mi piace promuovere zsh, la soluzione con i suoi globi estesi:

sed -i /KeyWord/d **/*(.)

Che ne dici di cancellare la parola "parola chiave". e non l'intera linea?
Suren Nihalani l'

s/KeyWord//g(sostituisce KeyWordcon '' (stringa vuota), gper tutti (non solo il primo su ogni riga).
Pierre Carrier

1

Puoi usare Vim in modalità Ex:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g ricerca globale

  2. d Elimina

  3. x salva e chiudi


in OSX che mi ha dato find: illegal option -- t, ho dovuto aggiungere. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.