我有elasticsearch.yml文件。
我需要根据用户输入更新path.data和path.logs值。
我编写了.sh脚本,将路径作为参数并替换字符串,但它替换为空值。
在脚本下使用此
sed -i.bak -e 's/# path.data:.*/ path.data: $2 /' "$1"
sed -i.bak -e 's/# path.logs:.*/ path.logs: $3 /' "$1"
示例:./updateconfig.sh /usr/local/elasticsearch/config/elasticsearch.yml /var/lib/elasticsearch /var/log/elasticsearch
我也试过双引号(“),但没有运气。
你可以帮我解决这个问题。
更新
尝试使用不同选项时添加示例和错误
示例:
sed -i.bak -e "s/# path.data:.*/ path.data: $2 /" "$1"
sed -i.bak -e 's># path.data:.*> path.data: $2 >' "$1"
sed -i.bak -e "'s># path.data:.*> path.data: $2 >'" "$1"
错误:
sed:-e表达式#1,字符32:
的未知选项s' sed: -e expression #1, char 1: unknown command:
''
答案 0 :(得分:1)
在here以上的示例中使用sed
进行了一些修改,如果变量名称在先前已知,我能够使这些命令有效: -
收到先前的论据后:$1
,$2
和$3
sed -i -e "s|^path.data.*|path.data:$2$1|g" -e "s|^path.logs.*|path.logs:$3$1|g" file
假设我的示例文件是虚拟的,如下所示,但具有实际的变量名称: -
path.data:/l/m/n
path.logs:/d/e/f
使用脚本,下面可以根据需要在OP中进行路径替换: -
#!/bin/bash
sed -i -e "s|^path.data.*|path.data:$2$1|g" -e "s|^path.logs.*|path.logs:$3$1|g" file
运行脚本时: -
$ ./script.sh /usr/local/elasticsearch/config/elasticsearch.yml /var/lib/elasticsearch /var/log/elasticsearch
现在验证原始文件的内容: -
path.data:/var/lib/elasticsearch/usr/local/elasticsearch/config/elasticsearch.yml
path.logs:/var/log/elasticsearch/usr/local/elasticsearch/config/elasticsearch.yml
感谢tripleee
's建议,我现在可以进行就地替换!