使用“ sed -i”将行替换为逗号,引号,空格和变量

时间:2019-01-11 18:17:05

标签: bash

我需要替换文件中的一行。新行包括路径,空格,逗号和引号。

替换此行:"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":_(用下划线替换空格),并在其后添加逗号。

请提出建议?

2 个答案:

答案 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解析。