我在下面的命令
中遇到了一些问题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的值中使用“/”时它会给出错误。我知道“/”字符的问题。但任何人都可以帮我解决这个问题。
感谢任何帮助。
答案 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