【问题标题】:using sed to remove only the last pattern matched on string使用 sed 仅删除字符串上匹配的最后一个模式
【发布时间】:2014-07-15 15:34:21
【问题描述】:

我正在尝试完成以下结果

给定一个使用以下参数执行的 bash 脚本

#Input
./xxx.sh "\\\"P1\\\"\\\"P2\\\"\\\"P3\\\"\\\"P4\\\"\\\"P5\\\""

我要去掉第五个参数

#Output
# "\\\"P1\\\"\\\"P2\\\"\\\"P3\\\"\\\"P4\\\""

不管第五个参数是空\\\"\\\"还是不\\\"P5\\\"

我做了下面的脚本,但只有在最后一个参数为空时才会删除。如果我也需要删除第四个第三个参数,例如,我该如何继续?

a=$*

b=` echo $a | sed 's/[\\"[:alnum:]\\"]*$//g' ` 
b=` echo $a | sed 's/[\\"*\\"]*$//g' `
#the last try bellow give me the reasonable result when the fifth param is empty
b=` echo $a | sed 's/[\\"\\"]*$//g' ` 
echo $b

对不起,我到现在还是个壳佬

我在 ksh shell 中遇到了问题,但这有效

b=` echo $a | sed -e 's/\\\\"[^"]*\\\\"$//g' `

谢谢大家

【问题讨论】:

    标签: regex bash shell sed


    【解决方案1】:

    使用awk 更容易做到这一点:

    a="\\\"P1\\\"\\\"P2\\\"\\\"P3\\\"\\\"P4\\\"\\\"P5\\\""
    awk 'BEGIN{FS=OFS="\\\\\\\""} {$10="";NF-=2}1' <<< "$a"
    \\\"P1\\\"\\\"P2\\\"\\\"P3\\\"\\\"P4\\\"
    

    【讨论】:

    • 感谢阿努布!完美的解决方案!
    • 我在另一个 linux 发行版上遇到了这个问题:.sh: syntax error: `
    • someVar==$(awk ' BEGIN{FS=OFS="\\\\\\\""} {$10="";NF-=2}1'
    • 你需要在someVar之后使用:someVar=$(awk 'BEGIN{FS=OFS="\\\\\\\""} {$10="";NF-=2}1' &lt;&lt;&lt; "$param_init")而不是==
    【解决方案2】:

    使用 sed:

    b=`sed 's/\\\\"[^"]*\\\\"$//g' <<< "$a"`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-07
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多