将部分图案从sed传递到shell

将部分图案从sed传递到shell,shell,sed,Shell,Sed,我有一个包含以下格式行的文件: w1#1#x w2#4#b w3#2#d 行中的每个单词(标记)(例如w1#1#x)由3部分组成,第一部分显示一些索引(本例中为w1),第二部分为整数(本例中为1),第三部分为字符(本例中为x) 现在,对于每个单词(令牌),我需要打印一个附加字段,该字段将根据第二部分和第三部分的值进行计算(即,第四部分将是第二部分和第三部分的函数),输出文件应如下所示: w1#1#x#f1 w2#4#b#f2 w3#2#d#f3 在哪里 f1=函数(1,x),f2=函数(4,b)

我有一个包含以下格式行的文件:

w1#1#x w2#4#b w3#2#d

行中的每个单词(标记)(例如w1#1#x)由3部分组成,第一部分显示一些索引(本例中为w1),第二部分为整数(本例中为1),第三部分为字符(本例中为x)

现在,对于每个单词(令牌),我需要打印一个附加字段,该字段将根据第二部分和第三部分的值进行计算(即,第四部分将是第二部分和第三部分的函数),输出文件应如下所示:

w1#1#x#f1 w2#4#b#f2 w3#2#d#f3

在哪里

f1=函数(1,x),f2=函数(4,b),f3=函数(2,d)

现在,使用sed模式,我可以识别每个单词(标记)中的组件,例如

echo$line | sed“s/([^#])#([^#]])#([^#]*)/\1#\2#\3/g”

其中\2和\3是模式的一部分(我之所以称它们为模式的一部分是因为)

现在,我需要使用\2和\3计算第四部分。我已经定义了一个shell函数getInfo(),它接受2个参数并执行所需的计算,然后返回第4部分。问题是在sed命令中插入此函数。我尝试了以下几点:

echo$line | sed“s/([^#])#([^#])#([^#]*)/\1#\2#\3`getInfo\2\3`/g”

但这是行不通的。Shell没有接收模式的部分作为参数

因此,问题是:

如何将模式的sed部分传递给shell(函数)

我可以很容易地编写一个shell脚本,它将逐字分割行并执行所需的工作,然后将文件缝合回去,但是如果shell能够在sed命令中从sed接收部分模式作为参数,我将非常感激

问候,


萨利尔·乔希(Salil Joshi)

到了一个地步,
sed
不再是正确的工具。我认为这项任务已经达到了这一点(但请参阅Smart by,它表明可以使用
bash
sed
完成这项任务)

您使用哪种替代工具?您不显示该函数,但如果可以在shell中使用shell函数方便地计算它,那么
awk
很可能足够强大,可以完成这项工作。我自己可能会选择Perl,但Python(或Ruby)也可以很好地工作。所有这些都允许您编写函数,读取数据,并在将数据写回之前将函数应用于数据


试图在sed中使用函数的问题在于它没有定义函数或执行shell函数的机制。要使用
sed
,您必须考虑通过数据的两次传递,第一次提取(唯一的)标记以进行后续处理,这将是对每个标记应用shell函数,生成一个
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) "; /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

谢谢你的建议,乔纳森。正如我提到的,我可以编写这些函数(即使是Python、Ruby等),但很长一段时间以来,我一直在想sed是否可以将这些部分导出回shell。从你的回答来看,答案似乎是否定的:-(正确-答案是(出于所有实际目的)不可以。如果是生死攸关的情况,Perl、Awk、Python都不能使用,那么可以使用
sed
uniq
sort
、shell函数等设计一个多步骤方案。但是,除非对可用的工具集有愚蠢的限制,
sed
这次不是正确答案。+1对于c杠杆演示,它可以用
sed
用足够的技巧来完成。这绝对是(IMO)但是,超越了合理的限制。特别是,如果数据文件包含shell元字符,那么执行shell函数可能是危险的。如果数据仅仅是带有简单空格和字母数字的多个散列项,您就可以了。令人印象深刻……就像@JonathanLeffler提到的,尽管这可能不是所有情况下都不工作,我会保留这个以供将来参考。感谢很多。注意到达尔文用户的注意到达尔文用户的注意,我不得不改变了一点sed语法,这样的方式(
-E
E所有情况下工作所有情况下工作工作,所有情况下工作,我会在所有情况下工作,我会保留这个以供将来参考。我会保留这个作为所有情况,我会保留这个作为未来参考。谢谢谢谢谢谢很多。注意到达尔文达尔文用户的注意到达尔文用户,我不得不改变了一点的SE语法语法语法语法语法,这样的方式((<代码>
-E>-E<
-E-E开关,开关,切换,不逃避Rege,从从从Rege,不脱离regex ReReRege的regex指令,切换,不脱离regex的regex的regex,换换换换换换换换,ReReReReRegeReReReReReReReReReReReReReReRegex指令,所有情况下,所有情况,>