只需使用 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