如何使用shell脚本更改文件串

时间:2016-08-11 07:25:54

标签: bash shell

我有一个配置文件xyz.conf,其中包含一些字段,我想根据用户的要求在它之间做一点改动。 (即错误,信息,调查,警告) 我怎么能用shell脚本呢?

实施例 我有以下几行

match => ["log_EventType", "ERROR"]
add_tag => [ "loglevelError" ]
if "loglevelError" in [tags] {

我想在

中更改这些行
match => ["log_EventType", "DEBUG"]
add_tag => [ "loglevelDebug" ]
if "loglevelDebug" in [tags] {

到目前为止,我所尝试的是: match => [“log_EventType”,“INFO”]

对于这一行,我创建了一个脚本

file=xyz.conf
err=$1
sed -i 's/"ERROR.*/"'$err'/' $file

我只是运行命令./script.sh INFO

但在输出中我得到了

match => ["log_EventType", "INFO

在INFO

字后面不会返回右括号

2 个答案:

答案 0 :(得分:1)

显然,它只是:

sed -i 's/ERROR/DEBUG/; s/loglevelerror/logleveldebug/' filename

在你的情况下,在INFO这个词后面没有返回结束括号, 因为您不是ERROR,而是ERROR.*。这意味着您希望在单词ERROR之后取代整行,而不仅仅是单词。

但我认为您想要处理一些额外的检查/条件, 你在这里没有提到。 请这样做,以便我们改进答案。

答案 1 :(得分:1)

此脚本解决了您的问题,让用户指定任何错误级别,并在整个conf文件中将其替换,无论文件首先出现在哪个错误级别:

list_item.xml

示例:

#!/bin/bash
file="xyz.conf"
err="${1,,}"
sed -i 's/\(match => \["log_EventType", "\)[^"]*/\1'${err^^}'/g; s/\("loglevel\)[^"]*/\1'${err^}'/g' $file

注意:$ ./script.sh error $ ./script.sh debug ${1,,}${err^^}将处理大写/小写,但可能不适用于4之前的bash版本。