linux下如何修改文件内容?

linux下如何修改文件内容?

我的 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_x6411x

因此,如果我们将其组合成一个sed表达式,我们会得到:

sed -iE 's/1[01]x(_64)*/12_64/' config*

相关内容