在“sed”内执行命令

在“sed”内执行命令

我有一个保存在文本文件中的随机内存地址列表,我需要将sed它们取出,解码它们,然后将它们保存回我的文件中。但是,我尝试执行的解码操作是在我不久前创建的 C++ 程序中处理的。我现在遇到的问题是在sed命令中执行C++;也就是说,我想反向引用需要解码的部分并将其用作我的 C++ 程序中的参数。我写了以下命令:

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

在我有机会阅读答案之前帖子说不sed执行命令。是不是真的sed不允许执行命令?如果是这样,假设我编写的命令是有效的sed序列,我将如何编写它perl

答案1

perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe:就像sed:在 中一次一行处理输入$_,评估传递给每一行的 perl [e] 表达式-e,并 [p] 打印每行的修改内容$_
  • s|X|Y|gei:替换Yin X( $_[g]全局,不区分大小写 [i],并视为Yperl [e] 表达式而不是基本字符串)。
  • (?<=0x): 向后看0x
  • [0-9a-f]{1,8}: 1 到 8 个十六进制数字,尽可能多
  • `./convAddrs $&`:替换为该 shell 命令行的输出,其中$&替换为匹配的部分。

答案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模式空间中不存在的任何内容。当您在替换上使用 GNU 的execute 标志时s///,它会将整个结果模式空间传递给作为$SHELL -c其第二个参数,然后随后将所有模式空间替换为写入$SHELLstdout 的内容。因此,我在上面首先打印之前的结果,然后在将命令行传递到 shell 的结果之后打印。

相关内容