regex - 尝试使用 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 更好还是别的什么?我只是不知道。
解决方案
这可能对您有用(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
推荐阅读
- xcode-ui-testing - 元素查询以检索最高数量的元素
- vba - Excel Solver:为每个迭代保存候选解和目标单元格的对应值
- widget - 使用 Flutter 进行简单的集成测试
- cypress - 等待对同一个 url 或端点的多个 XHR 请求
- python - Python QuerySelectField 和 request.form 返回 dict 键,而不是 dict 值
- javascript - 为什么shadow dom在检查模式下隐藏html元素?
- sas - 创建固定对
- ruby - 如何编辑来自 Paper Trail 版本的信息?
- java - java spring FATAL:用户“postgres”的密码认证失败
- reactjs - Dash.js 中出现 React js 切换视频源错误