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 つの呼び出しをsed1 つにまとめたことに注意してください。私はこの-eオプションが好きですが、多くの人はセミコロンを使用して 3 つのコマンドを区切ります。また、$(...)逆引用符よりも を使用していることにも注意してください。

于 2013-06-02T16:59:38.453 に答える