2009-07-13 82 views
3

在這兩個命令替換的問題,我的Cygwin和我的Linux機器(Debian的),我遇到了同樣的問題:Shell腳本。在我的腳本

我在shell腳本正與某種格式的ID,我想補充反斜槓()在斜線發生之前(/)。

我的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 2009-07-13 10:14:29

8

這是發生了什麼事情。從bash(1)手冊頁中,重點介紹我的:

使用舊式反引號形式的替換時,反斜線將保留其字面含義 ,除非後跟$,'或\。不帶反斜槓的第一個反引號將終止命令替換。使用$(command)形式時,括號之間的所有字符構成命令;沒有人專門處理。

所以很可能你需要更多的反斜槓來替代命令替換命令。 您可以通過設置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)形式:

# someidformatted=$(echo "${someid}" | sed 's/\//\\\//') 
+0

感謝您的回覆。 +1爲其他解決方案,接受一個和'設置-x'。 – sourcerebels 2009-07-13 10:36:58