Encontrar y eliminar líneas de todos los archivos de forma recursiva

12

He logrado aprovechar las ocurrencias de una palabra clave mediante el uso de

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

pero, las ocurrencias de KeyWord son demasiado grandes. Solo quiero eliminar todas las líneas que contienen esa palabra.

Busqué alrededor, sed parece ser la utilidad. ¿Alguien puede decirme qué comando haría el truco?

Gracias.

SurenNihalani
fuente

Respuestas:

23

Con un 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

El primer comando findencuentra todos los archivos estándar (no directorios, tuberías, etc.), los imprime separados por \0(para que los nombres de los archivos puedan contener espacios, líneas nuevas, etc.).

El segundo comando xargslee la salida de find, toma una lista basada en un separador ( \0debido a -0), invoca sed -i [...]con parámetros agregados de la lista ( sedse llamará varias veces si hay muchos archivos, ya que la longitud máxima de los parámetros está limitada en cada invocación).

El sedcomando modifica in-place ( -i).

En cuanto a /KeyWord/d, eliminará las líneas que contienen la expresión regular KeyWord.

Debería aprender seda comprender correctamente la sintaxis (simple pero inusual) y consultar las páginas de manual correspondientes para obtener más información sobre las herramientas involucradas aquí.


Y como me gusta promocionar zsh, la solución con sus globos extendidos:

sed -i /KeyWord/d **/*(.)
Pierre Carrier
fuente
¿Qué tal simplemente eliminar la palabra "palabra clave". y no toda la linea?
SurenNihalani
s/KeyWord//g(sustituye KeyWordcon '' (cadena vacía), gpara todos (no solo el primero en cada línea).
Pierre Carrier
1

Puede usar Vim en modo Ex:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g búsqueda global

  2. d Eliminar

  3. x guardar y cerrar

Steven Penny
fuente
en OSX que me dio find: illegal option -- t, tuve que agregar el. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik