Как использовать xargs с ed? - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу рекурсивно пакетно заменять строки внутри папки, и я решил использовать Perl. Я хотел бы посмотреть, есть ли решение, которое требует меньшей зависимости и работы на разных платформах.

Для перечисления файлов я могу использовать что угодно от ls до find до ag, rg. Позвольте мне продемонстрировать мою проблему с ls.

ls | xargs -I '{}' ed -s {} <<< $'='

Я получу это:

Is a directory newline appended =: No such file or directory

Поскольку канал используется для передачи имен файлов в xargs, а потоки (здесь-строка) не работают ( Как можно использовать heredoc с xargs? ). Интересно, можно ли использовать xargs с ed.

Меня беспокоит кроссплатформенность, и фактически эта команда будет помещена в package.json для npm run global_replace. Нам интересно, есть ли другие решения, кроме введения gulp-replace и gulp только для этой задачи.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

После некоторого исследования использование Herestring не является полностью невозможным:

find ... | xargs -0 -I{} sh -c 'ed -s "$1" <<< '"$',s/foo/bar/g\nw'" -- {}

И в package.json я должен сбежать от каждого ", так что теперь мы можем запустить npm run replace. Код выхода будет иметь статус 1 и выглядит не очень хорошо, хотя работает.

Большое спасибо @ Benjamin.W за помощь в комментариях!

0 голосов
/ 09 ноября 2018

Попробуйте это решение:

find . -name "*" | xargs sed -i 's/regex/replacestring/g'
...