我有一个保存在文本文件中的随机内存地址列表,我需要将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
:替换Y
inX
($_
[g]全局,不区分大小写 [i],并视为Y
perl [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 的e
xecute 标志时s///
,它会将整个结果模式空间传递给作为$SHELL -c
其第二个参数,然后随后将所有模式空间替换为写入$SHELL
stdout 的内容。因此,我在上面首先打印之前的结果,然后在将命令行传递到 shell 的结果之后打印。