При написании функций Bash для замены строк я столкнулся со странным поведением при использовании xargs.Это на самом деле сводит меня с ума в настоящее время, так как я не могу заставить его работать.К счастью, я смог прибегнуть к следующему простому примеру:
Определить простую функцию, которая удваивает каждый символ данного параметра:
function subs { echo $1 | sed -E "s/(.)/\1\1/g"; }
Вызов функции:
echo $(subs "ABC")
Как и ожидалось, результат будет:
AABBCC
Теперь вызовите функцию, используя xargs:
echo "ABC" | xargs -I % echo $(subs "%")
Удивительно, но результат теперь таков:
ABCABC
Кажется, что команда sed внутри функции теперь обрабатывает всю строку как один символ.Почему это происходит и как это можно предотвратить?
Вы можете спросить, почему я вообще использую xargs.Конечно, это упрощенный пример, и фактический вариант использования гораздо сложнее.
В исходном сценарии использования у меня есть программа, которая производит много выходных данных.Я передаю вывод через несколько команд grep, чтобы получить интересующие строки.После этого я передаю строки в sed для извлечения нужных мне данных из строк.Поскольку некоторые преобразования, которые мне нужно выполнить для данных, слишком сложны, чтобы выполнять их только с помощью регулярных выражений, я бы хотел использовать для них функцию.Итак, моя первоначальная идея заключалась в том, чтобы просто подключиться к функции, но я не смог заставить ее работать и в итоге получил решение xargs.Моя первоначальная идея была примерно такой:
command | grep ... | grep ... | grep ... | sed ... | subs
Кстати: я делаю это не из командной строки, а из сценария.Функция определена в том же самом скрипте, в котором она используется.
Я использую Bash 3.2 (Mac OS X по умолчанию), так что мне не помогут изящные вещи Bash 4.x, извините.
Я буду рад всему, что может пролить свет на эту тему.
С наилучшими пожеланиями
Фрэнк