2013-05-02 152 views
0

我在下面命令SED命令不工作

INPUT_FILE_NAME_PATH="/app/csa/sumit/xyz.out" 

sed -i "s/^$InputFile=.*/$InputFile='${INPUT_FILE_NAME_PATH}'/g" dashboard.prf 

ERROR : sed: -e expression #1, char 36: unknown option to `s' 

面臨着一些問題,當我使用INPUT_FILE_NAME_PATH的價值,而不使用「/」,那麼,它正在fine..but當我使用「/」在變量INPUT_FILE_NAME_PATH的值中,則發生錯誤。我知道「/」字符的問題。但是,任何人都可以幫助我解決這個問題。

任何幫助表示讚賞。

+1

裏面使用'sed'變量,你需要把它包'''而不是'''。 – fedorqui 2013-05-02 12:56:49

+0

您可以使用'@'而不是'/'作爲sed中's'運算符的分隔符。請記住,'$'是行尾特殊字符,所以它可能不會做你認爲它的事 – Petesh 2013-05-02 12:58:52

+0

謝謝fedorqui ...我已經更新了代碼..但它仍然不工作 – 2013-05-02 13:00:27

回答

1

可以使用@字符而不是/爲分隔符,讓你的代碼看起來像:

INPUT_FILE_NAME_PATH="/app/csa/sumit/xyz.out" 

sed -i '[email protected]^$InputFile=.*@$InputFile='${INPUT_FILE_NAME_PATH}'@g' dashboard.prf 

您可以使用sed -n和添加尾部p測試正則表達式,而無需修改有問題的文件並且僅在其匹配時顯示,例如:

sed -n '[email protected]^$InputFile=.*@$InputFile='${INPUT_FILE_NAME_PATH}'@gp' dashboard.prf 

並且只有在匹配時纔會打印。這是不是一個好主意,-n-i相結合,爲您結束了一個非常小的文件:(

+0

感謝Petesh ..它正在工作.. – 2013-05-02 13:06:41

+0

'$'只有當它在正則表達式結尾時才意味着「行尾」。你給的'sed'可以找到(在GNU sed版本4.2.1上) – cdarke 2013-05-02 13:10:26

+0

@cdarke謝謝你,我已經注意到並且已經刪除了這個段落 – Petesh 2013-05-02 13:11:58

0

只需用awk,sed的的-i的好處遠遠由SED問題與使用shell變量,如抵銷您當前所看到的:「」

INPUT_FILE_NAME_PATH="/app/csa/sumit/xyz.out" 

awk -v file="$InputFile" -v path="$INPUT_FILE_NAME_PATH" ' 
    { gsub("^"file"=.*", file"="path); print } 
' dashboard.prf > tmp && mv tmp dashboard.prf 

需要注意的是,像任何SED解決方案,上面用正則表達式上下文中的$ INPUTFILE變量,所以如果thatvariable包含像RE元字符,那麼你可以得到不需要的匹配,例如「foo.bar」會匹配「fooXbar」以及「foo.bar」。在sed中沒有可靠的解決方案(不要聽任何人告訴你逃脫RE元字符,因爲它不能可靠地完成),但在AWK你可以使用索引()來匹配字符串而不是一個正則表達式,如:

awk -v file="$InputFile" -v path="$INPUT_FILE_NAME_PATH" ' 
    index($0,file"=")==1{ $0 = file"="path) } { print } 
' dashboard.prf > tmp && mv tmp dashboard.prf 

我會用「指數( )「的方法,如果在你的輸入文件內容發生變化時,你將來會避免任何意外。

如果你的awk不支持-v分配變量,則:

awk ' 
    index($0,file"=")==1{ $0 = file"="path) } { print } 
' file="$InputFile" path="$INPUT_FILE_NAME_PATH" dashboard.prf > tmp && mv tmp dashboard.prf 

,或者如果你滿意的一個sed的解決方案,那麼你一定要幸福與基於RE-解決方案,以便:

awk ' 
    { gsub("^"file"=.*", file"="path); print } 
' file="$InputFile" path="$INPUT_FILE_NAME_PATH" dashboard.prf > tmp && mv tmp dashboard.prf 

終於在這裏是爲高爾夫球愛好者RE基解決方案:

awk '{gsub("^"f"=.*",f"="p)}1' f="$InputFile" p="$INPUT_FILE_NAME_PATH" dashboard.prf > tmp && mv tmp dashboard.prf 
+0

這絕對是一個更好的解決方案。如果不是因爲我最終不得不在debian系統上明確安裝'gawk',以使它與依賴'awk'的''gawk'而不是'mawk'的各種軟件包一起工作。 – Petesh 2013-05-02 15:23:32

+0

上面沒有特定的gawk。如果我是你,我會得到awk以外的awk,因爲mawk是最小功能的(幾乎總是不必要的)提高的執行速度,但即使在mawk中,上面的MIGHT不工作的唯一的東西是使用-v來分配變量和這是微不足道的,通過在命令之後分配它們。我會更新我的答案以表明這一點。 – 2013-05-02 15:47:05