我需要替换文件中的一行。新行包括路径,空格,逗号和引号。
替换此行:"download-dir"
进入此页面:___"download-dir": "/basedirectory/downloads",
(下划线替换空格)
我正在通过bash脚本运行sed -i
,并使用"$(dirname $(readlink -f $0))"
来获取基本目录(basedirectory /下载)。
我所能做的就是sed -i '/"download-dir"/c\'"$(dirname $(readlink -f $0))"/downloads ~/arq
,它将部分更改为我想要的行。
但是,我无法在路径前添加___"download-dir":_
(用下划线替换空格),并在其后添加逗号。
请提出建议?
答案 0 :(得分:0)
解决方案:命令或变量必须在'。
之间前一行:"download-dir": "path",
以下行:"download-dir": "/basedir/downloads",
代码:sed -i '/"download-dir"/c\ "download-dir": "'"$(dirname $(readlink -f $0))"'/downloads",' file
c \后面的空格是故意的。
谢谢。
答案 1 :(得分:0)
使用jq
以对所有可能的文件名都安全的方式生成内容,包括那些不带引号就不能在JSON文字中使用的字符的文件名:
newDir=$(realpath "${BASH_SOURCE%/*}") # $0 is unreliable; see BashFAQ #28
jq --arg newDir "$newDir" \
'.["download-dir"]=$newDir' \
<in.json >out.json
请参阅BashFAQ #28的回复:为什么不应该使用$0
来标识脚本的位置,the bash-hackers' wiki page on parameter expansion可以理解代替${varname%/*}
的{{1}}语法,并在BashWeaknesses中提到了JSON解析。