sed使用表达式随机化最后的数字

时间:2016-03-11 17:13:29

标签: regex linux sed

我需要解析一个文件,并在找到模式时随机化给定字符串的最后一位数字。

我在使用简单的情况时能够执行所需的结果,但是对于更复杂的情况则无法实现。

我想知道第二种情况有什么问题。

此示例可行。

echo 'AB111-1-13' | sed 's/\(AB111\)-\([0-9]*\)-\([0-9]*\)/echo \1-\2-$(echo \3*$RANDOM | bc )/ge'

但是这个不起作用。

echo '<http://name/link#AB111-1-13>' | sed 's/\(AB111\)-\([0-9]*\)-\([0-9]*\)/echo \1-\2-$(echo \3*$RANDOM | bc )/ge'

有什么想法吗?

EDIT 这是尝试运行第二个示例时的错误消息。

  

sh:-c:第0行:意外标记newline' sh: -c: line 0:附近的语法错误

1 个答案:

答案 0 :(得分:1)

GNU sed e标志将模式空间作为shell命令执行。

在第一个示例中,模式空间以AB111-1-13开始,变为echo AB111-1-$(echo 13*$RANDOM | bc ),这是一个有效的shell命令并被执行。 (我应该指出bc在这里是完全没有必要的,因为shell可以自己执行整数运算echo $((13 * RANDOM))。)

但是在你的第二个例子中,你将模式空间开始为<http://name/link#AB111-1-13>并变为<http://name/link#echo AB111-1-$(echo 13*$RANDOM | bc )>,它非常一个有效的shell命令,所以,大概你会得到一个shell

,当你试图执行时,错误(本来可以把它包含在问题中)

所以不要使用sed。使用可以评估awkperlpython等任意表达式的内容。