У меня есть файл, который содержит строки следующего формата:
w1 # 1 # x w2 # 4 # b w3 # 2 # d ...
Каждое слово (токен) в строке (например, w1 # 1 # x) состоит из 3 частей, первая показывает некоторый индекс (в данном случае w1), вторая представляет собой целое число (в данном случае 1), и третий символ (x в данном случае)
Теперь для каждого слова (токена) мне нужно напечатать дополнительное поле, которое будет рассчитываться на основе значения второй и третьей части (, т.е. , 4-я часть будет функцией 2-й и 3-я часть), и выходной файл должен выглядеть так:
w1 # 1 # x # f1 w2 # 4 # b # f2 w3 # 2 # d # f3 ...
, где
f1 = функция (1, x), f2 = функция (4, b), f3 = функция (2, d)
Теперь, используя шаблоны sed, я могу идентифицировать компоненты в каждом слове (токене), например,
echo $ line | sed "s / ([^ #] ) # ([^ #] ) # ([^ #] *) / \ 1 # \ 2 # \ 3 / g"
где \ 2 и \ 3 - части шаблона (я называю их частями шаблона из-за этой ссылки )
Теперь мне нужно вычислить 4-ю часть, используя \ 2 и \ 3. Я определил функцию оболочки getInfo (), которая принимает 2 аргумента, выполняет необходимые вычисления и возвращает 4-ю часть. Проблема заключается в вставке этой функции в команду sed. Я попробовал следующее:
echo $ line | sed "s / ([^ #] ) # ([^ #] ) # ([^ #] *) / \ 1 # \ 2 # \ 3`getInfo \ 2 \ 3` / g"
но это не работает. Оболочка не получает частей шаблона в качестве аргументов.
Итак, вопрос:
Как передать sed части шаблона в оболочку (функция)?
Я легко могу написать сценарий оболочки, который разбил бы строку на слово и выполнил бы требуемую работу, а затем сшил файл обратно, но я был бы очень признателен, если бы оболочка могла получить частей шаблона в качестве аргументов от sed внутри команды sed.
С уважением,
Салил Джоши