gpt4 book ai didi

sed 双条件?匹配行首,包含文本,然后追加

转载 作者:行者123 更新时间:2023-12-05 00:08:50 24 4
gpt4 key购买 nike

我有一个要在脚本中编辑的配置文件,有几行,但格式基本上是:

...
admin_users = alice, bob
admin_groups = accounting, finance
...

如果该行上尚不存在用户,我想将用户附加到 admin_users 行。

据我了解,我需要基本上结合两个条件......
/^admin_users/s/$/, charlie/ = 添加 , charlie到以 admin_users 开头的行 /charlie/!s/$/, charlie/ = 追加 , charlie到不包含 charlie 的行

我试过谷歌搜索,但我找不到任何相关的东西。如果这是可能的,语法和简短的解释将不胜感激。

最佳答案

为了捕捉更多特殊情况,让我们使用这个测试文件:

$ cat file
...
admin_users = alice, bob
admin_users = alice, charlieston
admin_users = alice, charlie, bob
admin_users = alice, bob, charlie
admin_groups = accounting, finance
...

综上所述,前两个 admin_users需要 charlie添加。后两个已经有了他。

添加 charlie仅当他不在时:
$ sed -r '/^admin_users .*, charlie(,|$)/{p;d}; /^admin_users / s/$/, charlie/' file
...
admin_users = alice, bob, charlie
admin_users = alice, charlieston, charlie
admin_users = alice, charlie, bob
admin_users = alice, bob, charlie
admin_groups = accounting, finance
...

这个怎么运作
  • -r
    使用扩展的而不是基本的正则表达式。 (在 OSX/BSD 上,使用 -E 代替。)
  • /^admin_users .*, charlie(,|$)/{p;d}
    如果 admin_users已有 charlie后跟逗号或行尾,然后打印,p ,按原样删除,d , 这样就不会对其应用进一步的命令。
  • /^admin_users / s/$/, charlie/
    如果我们到这里,那就意味着 charlie是不是已经上线了。因此,我们添加 charlie到最后。

  • Mac OSX

    以上是在 GNU sed 上测试的.对于 OSX/BSD sed , 尝试:
    sed -E -e '/^admin_users .*, charlie(,|$)/{p;d;}' -e '/^admin_users / s/$/, charlie/' file

    一个变化

    正如 Glenn Jackman 所建议的,这是另一种方法:
    sed '/^admin_users\>/ {/\<charlie\>/! s/$/, charlie/}' file

    这将选择以 admin_users 开头的行然后,仅当该行不包含 charlie ,进行替换。 \<\>是正则表达式,表示单词的开头或结尾。至少 GNU sed 支持它们。

    关于sed 双条件?匹配行首,包含文本,然后追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29567864/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com