3

Есть ли способ запустить xargs только на первом аргументе строки? Так что, если мой ввод является выводом по умолчанию от grep , вот так:

./file1       "matching string"
./file2       "matching 2"

Я хочу открыть все имена файлов в Vim с помощью чего-то вроде | xargs vim .

Могу ли я попросить xargs просто взять первое слово в каждой строке?

Я знаю, что есть и другие способы сделать это, включая передачу в AWK, чтобы убрать весь лишний мусор строки, и заставить grep возвращать только имя файла - мне интересно, можете ли вы сделать это с помощью xargs.

3 ответа3

5

Как утверждают другие, общие xargs не могут сделать это в одиночку. Придерживаясь общепринятых инструментов Unix, вам нужно использовать команду cut чтобы удалить лишнюю информацию, прежде чем отправлять ее в xargs.

Предполагая, что ваш вклад выглядит так:

./file1       "matching string"
./file2       "matching 2"

Вы можете использовать |cut -f 1 -d ' ' | xargs -n 1 vi для запуска команд.

  • Команда cut -f 1 -d ' ' отправляет только то, что указано в столбце 1, на выход.
  • xargs -n 1 vi говорит xargs запускать vi, но одновременно использовать только один файл.

Можно удалить -n 1 если вы хотите использовать один экземпляр vi для редактирования всех файлов (для сохранения буферов копирования / вставки между файлами).

1

Вы не можете сделать это с помощью самого xargs.

Таким образом, вы можете сделать так, чтобы grep выводил именно то, что вам нужно передать в xargs , или проходил через cut чтобы разделить то , что вам нужно между ними.

Помните, что это способ * nix - сохранять каждую утилиту как можно более сфокусированной и использовать их в комбинации для достижения результатов (вместо дублирования функций в нескольких утилитах).

1

Используя GNU Parallel вы можете сделать:

... | grep ... | parallel --colsep ' +' -X --tty vi {1}

Он работает и с emacs:

... | grep ... | parallel --colsep ' +' -X --tty emacs {1}

Вы можете установить GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

Посмотрите вступительные видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Пройдите учебник (man parallel_tutorial). Ты командная строка с любовью тебя за это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .