使用sed仅删除匹配在字符串上的最后一个模式

时间:2014-07-15 15:34:22

标签: regex bash shell sed

我试图完成以下结果

给定使用以下参数执行的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' `

谢谢你们

2 个答案:

答案 0 :(得分:2)

使用awk更容易做到:

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

答案 1 :(得分:1)

使用sed:

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