Insertar nueva línea si el archivo contiene una cadena

Insertar nueva línea si el archivo contiene una cadena

Necesito insertar 'nombre del paquete de importación' en la línea después de las importaciones. En archivos que contienen la palabra específica. Lo que intento:

find iOS/Chat \
  -type f \
  -name "*.swift" \
  -exec gsed -e "/Behavior/ " -e "20a import RxSwift" -i {} +;

También lo intenté: -exec gsed -e "/Behavior/20a import RxSwift" -i {} +; Parece que esta construcción no funciona.

gsed - gnused, no encontré cómo hacer que funcione con bsd sed. Mac OS.

UPD: Resultado cercano

find iOS/Chat -type f -name "*.swift*" -exec grep -iHn "Behavior" {} \; | cut -d: -f-1 | xargs gsed -i '/import Foundation/a import RxSwift' 

Contras:

  • si está configurado gsed -i '/import/a import RxSwift' its called for each import enter line. I want only first. Something like:gsed -i '0,/import/a import RxSwit'` no funciona para mí...

Sigo investigando....

Respuesta1

Ok, encontré la solución.

  • brew install gsed- necesario
find ./ \                                                                                                                                                          
 -type f \
 -name "*.swift*" \
 -exec grep -lHn "Reachability" {} \; | cut -d: -f-1 | xargs gsed -i -e '/import/{i\import RxReachability' -e ':a;n;ba}'

Cómo sedprimera ocurrencia:https://stackoverflow.com/a/9970915/887325

  • find- encontrar todos los archivos que contienen Reachabilitytexto;
  • cut- único camino
  • xargs- archivos de ruta como argumento paragsed
  • gsed- buscar la primera importlínea contiene {i\ - insertar una nueva línea:import RxReachability

Espero que esta respuesta me sea útil a los 90 años.

información relacionada