Можете ли вы массово редактировать все файлы, возвращенные в grep? - PullRequest
52 голосов
/ 11 ноября 2009

Я хочу массово редактировать тонну файлов, возвращаемых в grep. (Я знаю, я должен стать лучше в седе).

Так что если я сделаю:

grep -rnI 'xg_icon-*'

Как мне передать все эти файлы в vi?

Ответы [ 6 ]

76 голосов
/ 11 ноября 2009

Самый простой способ - заставить grep возвращать только имена файлов (-l вместо -n), которые соответствуют шаблону. Запустите это в подоболочке и передайте результаты в Vim.

vim $(grep -rIl 'xg_icon-*' *)
21 голосов
/ 11 ноября 2009

Хорошим общим решением для этого является использование xargs для преобразования стандартного вывода из процесса, такого как grep, в список аргументов.

А-ля:

grep -rIl 'xg_icon-*' | xargs vi
7 голосов
/ 17 июля 2013

Вы можете сделать это без какой-либо обработки вывода grep! Это даже позволит вам перейти на правильную линию (используя команды :help quickfix, например, :cn или :cw). Итак, если вы используете bash или zsh:

vim -q &lt(grep foo *.c)
7 голосов
/ 13 ноября 2009

если вы используете vim и параметр -p, он откроет каждый файл на вкладке, и вы можете переключаться между ними с помощью gt или gT или даже мыши, если у вас есть поддержка мыши в терминале

1 голос
/ 19 октября 2016
vi `grep -l -i findthisword *`
1 голос
/ 11 ноября 2009

если то, что вы хотите отредактировать, одинаково для всех файлов, то нет смысла использовать vi, чтобы сделать это вручную. (хотя на vi тоже можно писать скрипты), гипотетически это выглядит примерно так, так как вы никогда не упоминаете, что хотите редактировать

grep -rnI 'xg_icon-*' | while read FILE
do
    sed -i.bak 's/old/new/g' $FILE # (or other editing commands, eg awk... )
done
...