Что такое replstrs как {}?

В документации для xargs упоминается «replstr», который принимает флаг -I . Я начал читать об этом, когда нашел эту команду для запуска fswatch :

 fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {} 

и начал читать man- xargs для xargs

 -I replstr Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is specified) arguments to utility with the entire line of input. The resulting arguments, after replacement is done, will not be allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to the constructed arguments to utility, up to 255 bytes. The 255 byte limit does not apply to arguments to utility which do not contain replstr, and furthermore, no replacement will be done on utility itself. Implies -x. 

Размышление о терминах «replstr» похоже на то, что это, вероятно, означает нечто вроде «read оценить строку цикла печати», это то, для чего это не так? Я начал играть с ним, чтобы попытаться понять, что делает {} , но я не уверен, что я действительно понял это:

 ➜ scripts git:(master) ✗ {0..3} zsh: command not found: 0..3 ➜ scripts git:(master) ✗ echo {0..3} 0 1 2 3 ➜ scripts git:(master) ✗ echo {a..3} a ` _ ^ ] \ [ ZYXWVUTSRQPONMLKJIHGF EDCBA @ ? > = < ; : 9 8 7 6 5 4 3 ➜ scripts git:(master) ✗ echo {a..d} abcd ➜ scripts git:(master) ✗ echo cats and dogs | xargs cats and dogs ➜ scripts git:(master) ✗ echo cats and dogs | xargs {} xargs: {}: No such file or directory ➜ scripts git:(master) ✗ echo cats and dogs | xargs {} echo {} xargs: {}: No such file or directory ➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {} ➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {} cats and dogs 

Например, echo {a..3} действительно не имеет смысла для меня. Кажется, что это что-то делает, чтобы «заменить этот список строк здесь», но я не уверен, что это правильный способ взглянуть на него. Также я не уверен, что {} – specfic тип replstr, и если есть больше, или если replstr – это всего лишь что-то между двумя фигурными фигурными скобками. Хотелось бы узнать некоторые рекомендации по поводу того, как они работают.

3 Solutions collect form web for “Что такое replstrs как {}?”

Аргумент -I работает следующим образом: -I whatever означает, что происходит буквально из того, whatever заменяется аргументом команды. Демо-версия:

 $ echo "a b c" | xargs -I f echo hey f hey f hey a hey a hey b hey b hey c hey c 

Видеть? xargs взял каждую из строк a , b и c и заменил их вместо f в echo hey f hey f .

Нет {} .

Опция -I – POSIX. GNU xargs документирует устаревшую опцию -i которая, если она вызывается как -iwhatever ведет себя как -I whatever . Если он вызывается как -i он ведет себя как -I {} . В этом случае вхождения {} заменяются. {} явно вдохновлена ​​особенностью find : ее -exec предикат.

Синтаксис синтаксиса {a..b} и foo{a,b,c}bar обработанный его «расширением брекета». {} не имеет специального значения и передается команде as-is. (Если бы это было не так, это нарушило бы стандартно-совместимые, обычно встречающиеся find .)

replstr означает «строка замены» или «заменить строку».

Исходный replstr – {} . Он был впервые представлен с предложением команды exec find , где он заменяется каждым найденным именем файла, например

 find /tmp -name "foo*" -exec echo file {} found \; 

будет отображаться, предполагая, что два файла соответствуют шаблону:

 file foo1 found file foo2 found 

Команда xargs позволяет сделать то же самое с аргументами, построенными из строк, переданных на стандартный вход, а также позволяет указать что-то другое, чем {} качестве строки замены.

Обратите внимание, что по умолчанию replstr просто {} не содержит ничего внутри фигурных скобок, последний используется для разных целей, например диапазонов, как вы уже заметили, или расширения параметра.

{...} – расширение скобки оболочки , которое поддерживает такие списки, как {a,b,c} (расширяется до a , b и c ), а последовательности чисел, такие как {0..13} (расширяются до чисел 0 , 112 , 13 ) или символы {a..d} ( a , b , c , d ). (Расширение xargs не имеет ничего общего с {} заполнителем, используемым xargs ).

Несколько нечетная последовательность, которая {a..3} расширяется до, объясняется таблицей символов ASCII . Поскольку a не является числом, оба принимаются как символы, а расширение – это все символы между a и 3 по числовому значению кодовых символов. Как это бывает, a приходит после 3 , поэтому последовательность выполняется вниз через прописные буквы и цифры от 9 до 3.

Как видно, смешивание букв и цифр в таком диапазоне не очень полезно, но {a..z} или {A..Z} может быть, а также аналогичные [az] и [AZ] в регулярных выражениях и shell globs. (То есть, если вы можете игнорировать остальные буквы.)

  • Перемещение подкаталога в новый родительский каталог, где новое имя каталога увеличивается на 1
  • Почему «xargs bash -ic echo» не то же самое, что «xargs echo» или «xargs»?
  • Zgrep останавливается после первого совпадения, когда аргументы передаются из xargs
  • Преобразование строк новой строки в нуль-ограничение при использовании хвоста
  • Найти файлы рекурсивно, которые старше одного года и не принадлежат конкретному пользователю
  • поиск имен папок на основе списка, содержащегося в файле .txt
  • Невозможно запросить пользователя с помощью опции rm bultin prompt -i с помощью xargs и найти
  • Что делает xargs, если он используется без каких-либо параметров?
  • Есть ли способ манипулировать порядком аргументов stdin при использовании xargs, так же, как awk как $ 0, $ 1, $ 2 и т. Д.?
  • создать хеш md5 из рекурсивного списка файлов, когда некоторые пути имеют пробелы
  • Какова цель команды xargs -I?
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.