0

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

$ 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'`

...那我应该如何删除'

4

1 回答 1

2

它的外壳没有sed麻烦。您不能在单引号字符串中转义单引号。

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

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

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

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

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

于 2013-06-02T16:59:38.453 回答