首页 > 解决方案 > 尝试使用 sed 从 bash 脚本编辑配置文件以编辑键/值对

问题描述

我有一个配置文件,其中包含我需要从 bash 脚本修改的每行 1 个键/值对。这有点棘手,因为我需要修改一个特定的键/值对,它可能不存在于文件中,它可能存在但为空,或者它可能存在但已填充,如下所述。

文件的示例片段:

additional.urls=
cache.enable=true
compiler.cache_core=true

我需要找到键/值对“additional.urls=”并修改它。但没有什么是容易的,首先可能会填充该行,或者它可能根本不存在于文件中。

additional.urls=
或者
additional.urls=https://myurl.me

如果键/值对为空(= 之后除了空格之外什么都没有),那么我想将 url 附加到行尾:https://newurl.it

additional.urls=https://newurl.it

如果它全部丢失,我想将整个键/值行插入文件中,最好是在顶部,但这并不重要。

然后它变得更棘手,如果它已经有一个值(可能是 1 个或多个 url 逗号分隔)我需要保留已经存在的所有内容并附加到行尾添加一个逗号,然后是新的 url:

additional.urls=https://myurl1.me,https://myurl2.me
变成:
additional.urls=https://myurl1.me,https://myurl2.me,https://newurl.it

我不知道该怎么做。如果只是搜索和替换,我知道该怎么做,但条件让我发疯。也许 sed 不是正确的答案,是 awk 更好还是别的什么?我只是不知道。

标签: regexbashawksedgrep

解决方案


这可能对您有用(GNU sed):

sed -zEi ':a;
          s#^additional\.urls=.*#&,https://newurl.it#m;
          s/^(additional\.urls=),/\1/m;
          t;
          s/^/additional.urls=\n/;
          ta' file

将文件放入内存 ( -z),使用扩展的正则表达式 ( -E) 并就地编辑 ( -i)。

追加,https://newurl.it到一行开头additional.urls=

如果行开头additional.urls=,存在,请删除,.

如果任何一个换人成功,就退出。

否则, additional.urls=\n在文件开头插入,然后重复。

NBm在多行处理的替换中使用标志。

命令可能会被展平:

sed -zEi ':a;s#^additional\.urls=.*#&,https://newurl.it#m;s/^(additional\.urls=),/\1/m;t;s/^/additional.urls=\n/;ta' file

推荐阅读