2009-07-13 6 views
3

、私のCygwinと私のLinuxボックス(Debianは)私は同じ問題を経験している:シェルスクリプト。私のスクリプト内のコマンド置換の問題の両方で

私は、IDSのフォーマットのいくつかの種類にシェルスクリプトで働いている、私は追加したいですスラッシュオカレンス(/)の前のバックスラッシュ()。

私のsedスクリプトは私の端末でうまく機能している:

# export someid="314-12345/08" 
# echo "${someid}" | sed 's/\//\\\//' 

出力:

314-12345\/08 

しかしないだけでなく、私はcommand substitutionを実行する場合:私は何

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'` 
sed: -e expression #1, char 9: unknown option to `s' 

ここに行方不明?

ありがとうございます。

答えて

13

sedのセパレータとして/を使用する義務はありません。

s/a/c/ 

あなたのケースでそう

s#a#c# 

になる可能性:

someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'` 

は、仕事をするだろう。

私は、問題が/エスケープの不足が原因であると推測できます。

+0

ありがとうございます。この場合は代わりに#を使用することは明らかです。 – sourcerebels

8

ここでは何が起こっているのですか? bash(1)のマニュアルページから、強調表示:

旧式のバッククォート形式の置換を使用すると、バックスラッシュは$、 '、または\が続く場合を除いてリテラルの意味 を保持します。バックスラッシュで始まる最初のバッククォートは、コマンド置換を終了します。 $(コマンド)形式を使用すると、括弧内のすべての文字がコマンドを構成します。特別に扱われるものはありません。

普通のコマンドよりも、コマンド置換に多くのバックスラッシュが必要です。 あなたはset -xを設定することで、これをデバッグすることができます。

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'` 
++ echo 314-12345/08 
++ sed 's/\//\\//' 
sed: 1: "s/\//\\//": bad flag in substitute command: '/' 
+ someidformatted= 
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//') 
++ echo 314-12345/08 
++ sed 's/\//\\\//' 
+ someidformatted='314-12345\/08' 

だから、あなたは\\の発生が\になってされることを見ることができます。より多くのバックスラッシュを追加することができますが、私は$(command)フォームを好んでいます:

+0

ご返信ありがとうございます。 +1と 'set -x'を受け入れる他のソリューションに対しては+1。 – sourcerebels

関連する問題