【发布时间】:2011-09-28 16:42:57
【问题描述】:
我在 bash say parse 中有一个函数,它接受一个参数,函数名为 f。我要处理的文件有点像
a@b@c@
a@d@e@g@
m@n@
t@
我想给出输出为
a@f(b)@f(c)@
a@f(d)@f(e)@f(g)@
m@f(n)@
t@
这就是将函数 f 应用于除第一个之外的所有函数。任何线索,我该怎么做?
【问题讨论】:
我在 bash say parse 中有一个函数,它接受一个参数,函数名为 f。我要处理的文件有点像
a@b@c@
a@d@e@g@
m@n@
t@
我想给出输出为
a@f(b)@f(c)@
a@f(d)@f(e)@f(g)@
m@f(n)@
t@
这就是将函数 f 应用于除第一个之外的所有函数。任何线索,我该怎么做?
【问题讨论】:
应该这样做:
sed 's/@\([^@]*\)/@f(\1)/g'
如果所有字段都是单个字符,您可以稍微简化一下(例如,使用. 而不是\([^@]*\))。
【讨论】:
也许这就是你想要的?
例如你有一个名为 sqr.sh 的脚本:
kent$ cat sqr.sh
#!/bin/bash
echo $(($1*$1))
现在你想在你的输入上应用上面的函数:
kent$ echo "foo@2@3@4@
0@10@20@
x@"|awk -F'@' -v OFS=@ '{for(i=2;i<=NF;i++) if($i) "./sqr.sh "$i|getline $i; print}'
foo@4@9@16@
0@100@400@
x@
【讨论】:
你可以使用 sed:
sed -e 's/@\(.\)/@f(\1)/g'
【讨论】:
$ echo "t@" | sed -e 's/@\(.\)/@f(\1)/g' 结果给了我“t@”。
awk 'BEGIN {OFS=FS="@"} {for (i=2; i<=NF-1; i++) $i="f("$i")"; print}'
【讨论】:
echo "ab@cd@ef%%%" | awk 'BEGIN {OFS=FS="@"} {for (i=2; i<=NF-1; i++) i=$(func $i); print}' 这只是挂在终端上(或者等待输入,尽管我真的不知道为什么)。我想在元素上应用函数 f 而不仅仅是在输出中打印它。
$() 是 shell 语法,而不是 bash。对于 awk,您需要使用 system()