Выполнить команду внутри «sed»

9

У меня есть список случайных адресов памяти, сохраненных в текстовом файле, и мне нужно sedих распечатать, декодировать и сохранить обратно в мой файл. Однако операция декодирования, которую я пытаюсь выполнить, обрабатывается в программе C ++, которую я создал некоторое время назад. Проблема, с которой я сталкиваюсь сейчас, - это выполнение C ++ внутри sedкоманды; то есть я хочу сделать обратную ссылку на часть, которая должна быть декодирована, и использовать ее в качестве аргумента в моей программе на C ++. Я написал следующую команду:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

раньше у меня была возможность прочитать ответ в этом посте о том, что sedон НЕ выполняет команды. Правда ли, что sedне позволяет выполнять команды? Если да, то если я написал правильную sedпоследовательность, как бы я ее записал perl?

Фади Ханна АЛ-Касс
источник
ссылка добавлена. мой плохой :)
Фади Ханна АЛ-Касс

Ответы:

8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: like sed: обрабатывать входные данные по одной строке за раз $_, оценивать perl [e] xpression, переданное -eдля каждой строки, и [p] повторно модифицировать $_для каждой.
  • s|X|Y|gei: Замена Yдля Xв $_([г] lobally, случай [I] nsensitively, и лечение Yкак Perl [е] Xpression вместо основной строки).
  • (?<=0x): Взгляд позади для 0x.
  • [0-9a-f]{1,8}: от одной до 8 шестнадцатеричных цифр, как можно больше
  • `./convAddrs $&`: заменить выводом этой командной строки оболочки, где $&заменяется соответствующей частью.
Стефан Шазелас
источник
Я получаю следующую ошибку при выполнении вашей команды: отсутствие пробела между шаблоном и следующим словом не рекомендуется в строке -e 1. Модификаторы регулярного выражения "/ a" и "/ d" являются взаимоисключающими в строке -e 1, в конце модификаторов регулярных выражений строки "/ a" и "/ d" являются взаимоисключающими в строке -e 1, в конце строки. Не удается найти терминатор строки "` "нигде до EOF в строке -e 1.e
Фади Ханна AL-Kass
1
Конечно, извините, плохо, вам нужно изменить разделитель, поскольку мы не можем использовать его /здесь, поскольку он используется внутри запасной части. Исправлено.
Стефан Шазелас
Черт, а я думал, что я неплохо справился с Perl one liners, +1!
Тердон
2

Может быть или не быть правдой, что sedне может выполнять команды. Это не относится к GNU sed:

sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e  's/\n.//gp;g;s/^/#/e' <"$1"

Мне непонятно, что конкретно может быть в вашем <$1входе, и поэтому я стараюсь #закомментировать все, что не находится command \2в пространстве шаблонов. Когда вы используете eфлаг GNU xecute в s///ubstitution, он передает все результирующее пространство шаблона в $SHELL -cкачестве второго аргумента, а затем впоследствии заменяет все пространство шаблона на то, что записано в этот стандартный $SHELLвывод. Так что я выше я печатаю все ваши результаты были раньше, а затем после результатов передачи командной строки в оболочку.

mikeserv
источник