Znajdowanie i usuwanie linii ze wszystkich plików rekurencyjnie

14

Udało mi się zastąpić wystąpienia słowa kluczowego za pomocą

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

ale wystąpienia słowa kluczowego są zbyt duże. Chcę tylko usunąć wszystkie wiersze zawierające to słowo.

Rozejrzałem się wokół, wygląda na to, że sed jest narzędziem. Czy ktoś może mi powiedzieć, jakie polecenie by załatwiło sprawę?

Dzięki.

SurenNihalani
źródło

Odpowiedzi:

25

Z GNU sed:

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

Z OSX sed:

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

Pierwsze polecenie findwyszukuje wszystkie standardowe pliki (nie katalogi, potoki itp.), Drukuje je oddzielone \0(tak, że nazwy plików mogą zawierać spacje, znaki nowej linii itp.).

Drugie polecenie xargsodczytuje wynik find, pobiera listę opartą na separatorze (z \0powodu -0), wywołuje sed -i [...]z dodanymi parametrami z listy ( sedbędzie wywoływana wiele razy, jeśli jest dużo plików, ponieważ maksymalna długość parametrów jest ograniczona w każde wywołanie).

W sedmodyfikuje poleceń w miejscu ( -i).

Jeśli chodzi o /KeyWord/dto, usunie wiersze zawierające wyrażenie regularne KeyWord.

Powinieneś nauczyć sedsię poprawnie rozumieć składnię (prostą, ale niezwykłą) i odnieść się do odpowiednich stron podręcznika, aby uzyskać więcej informacji na temat zaangażowanych tutaj narzędzi.


I jak lubię promować zsh, rozwiązanie z rozszerzonymi globami:

sed -i /KeyWord/d **/*(.)
Pierre Carrier
źródło
Może po prostu usuniesz słowo „słowo kluczowe”. a nie cała linia?
SurenNihalani,
s/KeyWord//g(substytuty KeyWordz „” (pusty ciąg znaków), gdla wszystkich (nie tylko pierwszy na każdej linii).
Pierre Carrier
1

Możesz używać Vima w trybie Ex:

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

  2. d usunąć

  3. x Zapisz i zamknij

Steven Penny
źródło
w OSX, który mi dał find: illegal option -- t, musiałem dodać. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik