只需用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
裏面使用'sed'變量,你需要把它包'''而不是'''。 – fedorqui 2013-05-02 12:56:49
您可以使用'@'而不是'/'作爲sed中's'運算符的分隔符。請記住,'$'是行尾特殊字符,所以它可能不會做你認爲它的事 – Petesh 2013-05-02 12:58:52
謝謝fedorqui ...我已經更新了代碼..但它仍然不工作 – 2013-05-02 13:00:27