找到一个字符串并替换该字符串的整行

时间:2016-10-13 22:04:08

标签: linux shell sed

我需要使用shell命令更新key2文件中的特定键(例如yaml)的值。我正在尝试使用sed,但只有在我有特定值时它才有效,例如,在这种情况下为TBD。但是我希望每次更新值而不管任何值。我的替换字符串也存储在变量中。任何人都可以建议我使用什么命令?

hash.yaml file

---
key1: val1
key2: <TBD>
key3:
 - val3_1
 - val3_2

这是我尝试过的,也适合我。但只有我有&#34; TBD&#34;作为我的搜索键。

sed -i "s;<TBD>;$var;g" hash.yaml

2 个答案:

答案 0 :(得分:1)

您可以使用此sed将键key2的任何值替换为存储在名为$var的变量中的新值:

var='foobar'

sed -E "s~^([ \t]*key2:[ \t]*).*~\1$var~" hash.yml

key1: val1
key2: foobar
key3:
 - val3_1
 - val3_2

在表达式^([ \t]*key2:[ \t]*).*中,我们在第一行的key2:与之前和之后的可选空格匹配。 .*最后会匹配key2的所有内容。

如果您想就地编辑文件,请使用-i的{​​{1}}标记:

sed

答案 1 :(得分:0)

中使用正确的YAML解析器(适合正确工作的正确工具......):

#!/usr/bin/perl

use Config::YAML;
use YAML::XS qw/DumpFile/;

my $ds = Config::YAML->new(
    config => "hash.yaml"
);

$ds->{key2} = 'FOOBAR';

DumpFile("./new.yaml", $ds);

然后,

cat new.yaml