1

我在下面的命令中遇到了一些问题

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 的值中使用“/”时,它会给出错误。我知道“/”字符的问题。但是任何人都可以帮助我解决这个问题。

任何帮助表示赞赏。

4

2 回答 2

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

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

于 2013-05-02T13:01:11.327 回答
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
于 2013-05-02T13:51:31.200 回答