【问题标题】:Scripting in Bash在 Bash 中编写脚本
【发布时间】: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 sed awk


    【解决方案1】:

    应该这样做:

    sed 's/@\([^@]*\)/@f(\1)/g'
    

    如果所有字段都是单个字符,您可以稍微简化一下(例如,使用. 而不是\([^@]*\))。

    【讨论】:

    • 对于 t@ 它给了我 t@f() 我必须在值上应用函数而不是打印语句。也就是说,如果函数是取 x 的平方,那么我应该打印 x^2 的值。
    【解决方案2】:

    也许这就是你想要的?

    例如你有一个名为 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@
    

    【讨论】:

    • 这就像魅力一样,只是如果 $i 中有任何空格,那么它会做一些坏事。我尝试了像“./sqr.sh $i”、“./sqr.sh”这样的组合${i}", "./sqr.sh ""$i", "./sqr.sh ""${i}" 但这些都不起作用..
    • 然后在将空格传递给脚本之前删除空格(例如 sqr.sh)。
    • 但是我需要处理大量特殊字符。无论如何,非常感谢:-)
    【解决方案3】:

    你可以使用 sed:

    sed -e 's/@\(.\)/@f(\1)/g'
    

    【讨论】:

    • 对于 t@ 它给了我 t@f() 我必须在值上应用函数而不是打印语句。也就是说,如果函数是取 x 的平方,那么我应该打印 x^2 的值。
    • 我没有看到这个结果:$ echo "t@" | sed -e 's/@\(.\)/@f(\1)/g' 结果给了我“t@”。
    • 如果您需要评估结果(并且它是有效的 bash),您可以简单地将其包含在 $(...) 中以执行输出。
    • 它只是回显 %%%$(parse2(cigar))%%%$(parse2(jump))%%%$(parse2()) 而不是应用函数并返回结果。
    • 有点不清楚你在这里实际想要完成什么。 bash 函数的应用不使用括号,所以我不确定这些是您试图调用的 bash 函数。但是,将整个 sed 操作用 $(...) 括起来会导致 sed 的输出被 bash 执行。 HTH。
    【解决方案4】:
    awk 'BEGIN {OFS=FS="@"} {for (i=2; i<=NF-1; i++) $i="f("$i")"; print}'
    

    【讨论】:

    • query=echo "ab@cd@ef%%%" | awk 'BEGIN {OFS=FS="@"} {for (i=2; i&lt;=NF-1; i++) i=$(func $i); print}' 这只是挂在终端上(或者等待输入,尽管我真的不知道为什么)。我想在元素上应用函数 f 而不仅仅是在输出中打印它。
    • 您的问题不清楚。函数在哪里定义?在 awk/shell/...?请注意,$() 是 shell 语法,而不是 bash。对于 awk,您需要使用 system()
    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多