我怎么逃避'在sed?

时间:2013-06-02 16:47:17

标签: sed sh

我不明白我在做错了什么:

$ cat fixnames.sh
#!/bin/sh

for i in *mp3
do
    j=`echo $i | sed -e's/ /_/g'`
    j=`echo $j | sed -e's/_(...)_/_/g'`
    j=`echo $j | sed -e's/\'//g'`
    echo $j
done
$ ./fixnames.sh
./fixnames.sh: 1: Syntax error: Unterminated quoted string

我想/bin/sh行不喜欢......

j=`echo $j | sed -e's/\'//g'`

...那我怎么想删除'

1 个答案:

答案 0 :(得分:2)

shell不是sed给出麻烦。您无法在单引号字符串中转义单引号。

for i in *mp3
do
    j=$(echo $i | sed -e 's/ /_/g' -e 's/_(...)_/_/g' -e "s/'//g")
    echo $j
done

在这种情况下,在表达式周围使用双引号就足够了。其他时候,你需要更加小心使用双引号(stray $需要转义等),或者使用规范序列'\''在单引号字符串中嵌入单引号:

-e 's/'\''//g'

'\''序列停止当前单引号字符串,插入转义单引号(实际上只是单引号),并恢复单引号字符串。

请注意,我将sed的3次调用合并为一次;我喜欢-e选项,但很多人会使用分号来分隔三个命令。另请注意使用$(...)优先于后引号。