我的 Linux 盒子里有 3 个配置文件,其中包含自定义应用程序的配置信息。我想更改配置文件中的一些值。文件内容和说明如下:
config1文件内容:
set VAR1=/app/client/10x_64/instance
配置2文件内容:
set VAR2=/app/client/11x/instance
config3文件内容:
set VAR3=/app/client/11x_64/instance
我想将所有文件中的所有值 10x_64、11x、11x_64 更改为 12x_64。目前我使用三个命令来更改内容;命令如下:
sed -i 's/10x_64/12x_64/g' config1
sed -i 's/11x/12x_64/g' config2
sed -i 's/11x_64/12x_64/g' config3
我想要一个通用命令来更改所有 3 个文件的内容。
答案1
如果你想要一个单一的表达式,你可以这样做:
sed -i 's#/client/[^/]*#/client/12x_64#g' config*
我使用/client/[^/]*
标记来查找我们想要替换的内容(即下/client/
一个之后但之前的任何内容),但如果避免匹配文件中的其他项目,/
我们可以这样做。client/[^/]*/instance
答案2
你可以像这样简单地组合它们:
sed -i 's/10x_64/12x_64/g;s/11x/12x_64/g;s/11x_64/12x_64/g' config*
答案3
如何准备一个“模板配置文件”,在其中替换特定版本所需的配置部分?假设您有以下模板
#/bin/bash
echo "set ##V1##=/app/client/##ARCH1##/instance" > cfg-file1
echo "set ##V2##=/app/client/##ARCH2##/instance" > cfg-file1
echo "set ##V3##=/app/client/##ARCH3##/instance" > cfg-file1
然后您可以根据命令行参数按版本执行替换命令:
#!/bin/bash
[ $# -lt 1 ] && (echo "usage: replace <version>"; exit 1;)
if [ "$1" == "1" ]; then
cat template.txt | sed -e "s/##V1##/VAR1/g;s/##ARCH1##/arch_xy_/g;s/##V2##/VAR2/g;s/##ARCH2##/arch2_xy_/g;"
# etc...
fi
这可以很容易地扩展。
答案4
您可以将所有三个命令组合成一个表达式。您想要做的是将所有情况替换1
为 a0
或 a 1
,然后是 an x
,然后是可选的_64
。这可以通过以下扩展正则表达式来表达:
1[01]x(_64)*
表示[ ]
一个字符类,因此[01]
匹配 1 或 0。该(foo)*
构造将匹配 0 个或多个 的实例foo
。因此,(_64)*
将匹配字符串_64
(及其重复项,如_64_64_64
)和空字符串。这可以让您在不匹配时同时匹配 和11_x64
。11x
因此,如果我们将其组合成一个sed
表达式,我们会得到:
sed -iE 's/1[01]x(_64)*/12_64/' config*