在“ sed”内执行命令


9

我有一个保存在文本文件中的随机内存地址列表,我需要将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


链接已添加。我的坏事:)
法迪·汉娜·卡斯

Answers:


8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe:like sed:一次处理输入中的一行$_,评估-e每行传递给perl的[e] xpression,并为每行修改[p] rint $_
  • s|X|Y|gei:替代YX$_([G] lobally,壳体[I] nsensitively,和治疗Y作为一个perl [E] XPRESSION代替基本的字符串)。
  • (?<=0x):寻找背后0x
  • [0-9a-f]{1,8}:1到8个十六进制数字,越多越好
  • `./convAddrs $&`:替换为该shell命令行的输出,其中$&替换为匹配的部分。

执行命令时出现以下错误:-e第1行不建议使用模式和后续单词之间的空格。-e行1的正则表达式修饰符“ / a”和“ / d”在结尾处互斥行正则表达式修饰符“/ a”和“/ d”是在-e行1互斥,在线路的一端在-e行1.无法找到字符串结束“`” EOF之前的任何地方
法迪汉娜AL-卡斯

1
当然,对不起,很抱歉,您需要更改分隔符,因为我们/在这里不能使用分隔符,因为分隔符是在替换零件中使用的。已更正。
斯特凡Chazelas

该死的,尽管在Perl one的衬里上还不错,但+1!
terdon

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.