我有一个文件,其中包含以下格式的行:
w1#1#x w2#4#b w3#2#d ...
该行中的每个单词(标记)(例如 w1#1#x)由 3 部分组成,第一个部分显示某个索引(本例中为 w1),第二个是整数(本例中为 1),第三个是一个字符(在本例中为 x)
现在,对于每个单词(标记),我需要打印一个附加字段,该字段将根据第二部分和第三部分的值进行计算(i.e.,第四部分将是第二部分和第三部分的函数),输出文件应如下所示:
w1#1#x#f1 w2#4#b#f2 w3#2#d#f3 ...
where
f1 = 函数(1,x), f2 = 函数(4,b), f3 = 函数(2,d)
现在,使用 sed 模式我可以识别每个单词(标记)中的组件,e.g.,
回显 $line | sed "s/([^#])#([^#])#([^# ]*) /\1#\2#\3 /g"
其中 \2 和 \3 是图案的部分(我打电话给他们图案的部分因为这个链接 http://www.grymoire.com/Unix/Sed.html#uh-4)
现在,我需要使用 \2 和 \3 计算第四部分。我定义了一个 shell 函数 getInfo() ,它接受 2 个参数并执行所需的计算并返回第四部分。问题是在 sed 命令中插入这个函数。我尝试了以下操作:
回显 $line | sed "s/([^#])#([^#])#([^# ]*) /\1#\2#\3`getInfo \2 \3` /g"
但这不起作用。外壳没有收到图案的部分作为参数。
所以问题是:
如何通过sed图案的部分到外壳(函数)?
我可以轻松地编写一个 shell 脚本,它将逐字分割行并执行所需的工作,然后将文件缝合回来,但如果 shell 可以接收图案的部分作为 sed 命令中 sed 的参数。
Regards,
萨利尔·乔希
这可能对你有用:
func(){ echo "$1#$2#$3#$2$3"; }
export -f func
echo "w1#1#x w2#4#b w3#2#d" |
sed 's/\([^#]*\)#\([^#]*\)#\([^ ]*\) \?/echo -n "$(func \1 \2 \3) "; /g;s/$/echo ""/' |
sh
w1#1#x#1x w2#4#b#4b w3#2#d#2d
或者如果你有 GNU sed:
func(){ echo "$1#$2#$3#$2$3"; }
export -f func
echo "w1#1#x w2#4#b w3#2#d" |
sed 's/\([^#]*\)#\([^#]*\)#\([^ ]*\) \?/echo -n "$(func \1 \2 \3) "; /ge;s/.$//'
w1#1#x#1x w2#4#b#4b w3#2#d#2d
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)