Вставьте новую строку, если файл содержит строку

Вставьте новую строку, если файл содержит строку

Мне нужно вставить 'import packagename' в строку после imports. В файлах, которые содержат определенное слово. Что я пробую:

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

Также пробовал: -exec gsed -e "/Behavior/20a import RxSwift" -i {} +; Похоже, эта конструкция не работает.

gsed - gnused, я не нашел как make работать с bsd sed. mac os.

UPD: Близкий результат

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

Минусы:

  • если установить 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'` у меня не работает...

Продолжаем расследование...

решение1

Хорошо, я нашел решение.

  • brew install gsed- нужный
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}'

Как sedпервое появление:https://stackoverflow.com/a/9970915/887325

  • find- найти все файлы, содержащие Reachabilityтекст;
  • cut- единственный путь
  • xargs- пути к файлам как аргумент дляgsed
  • gsed- найти первую importстроку, содержащую {i\ - вставить новую строку:import RxReachability

Надеюсь, этот ответ будет мне полезен в 90 лет.

Связанный контент