SED命令无效

时间:2013-05-02 12:56:11

标签: shell 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的值而不使用“/”时,它工作正常..但是当我在变量INPUT_FILE_NAME_PATH的值中使用“/”时它会给出错误。我知道“/”字符的问题。但任何人都可以帮我解决这个问题。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用@字符代替/作为分隔符,因此您的代码如下所示:

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

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

您可以使用sed -n并添加尾随p来测试正则表达式,而无需修改相关文件,只显示它是否匹配,例如:

sed -n 's@^$InputFile=.*@$InputFile='${INPUT_FILE_NAME_PATH}'@gp' dashboard.prf

并且仅在匹配时才会打印。结合-n-i是一个好主意,因为你最终得到一个非常小的文件:(

答案 1 :(得分:0)

只需使用awk。 sed的-i的好处远远超过使用shell变量的sed问题,比如你已经遇到的那些:

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变量,因此如果该变量包含RE元字符,如“。”然后你可能得到不合适的比赛,例如“foo.bar”将匹配“fooXbar”以及“foo.bar”。在sed中没有强大的解决方案(不要听任何人告诉你逃避RE元字符,因为它无法可靠地完成),但在awk中你可以使用index()来匹配字符串而不是正则表达式,例如:

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

我会使用“index()”方法,如果你是为了避免在将来输入文件内容发生变化时出现任何意外。

如果你的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