我需要解析一个文件,并在找到模式时随机化给定字符串的最后一位数字。
我在使用简单的情况时能够执行所需的结果,但是对于更复杂的情况则无法实现。
我想知道第二种情况有什么问题。
此示例可行。
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:
附近的语法错误
答案 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
。使用可以评估awk
或perl
或python
等任意表达式的内容。