【问题标题】:How can i except specific lines with sed?我怎样才能用 sed 排除特定行?
【发布时间】:2020-09-15 18:34:48
【问题描述】:

我有这个命令来运行 git log 并刷新文件列表:

sed -E 's|(.*): .*|echo \1: $(git log -1 --pretty="format:%ct" \1)|e' app/config/file.yml

我的问题是这个命令刷新 file.yml 中的每一行,但我有一个我不想刷新的前缀。前缀是 web/compile/*

我尝试这样做,但不幸的是删除了 /web/compile 前缀的所有内容。

sed -i.bkp '/web\/compiled\/*/!e' -E 's|(.*): .*|echo \1: $(git log -1 --pretty="format:%ct" \1)|e' app/config/file.yml

【问题讨论】:

    标签: linux git ubuntu sed


    【解决方案1】:
    • 首先,您应该知道使用 sed 修改 yaml 文件是有风险的。 (我看到你将主要的东西保留到最后一个 : 以避免干扰缩进,但这并不安全)

    • 使用 sed,你可以通过/pattern/{action} 匹配一个模式,这里你只需用你的“前缀”路径填充pattern 部分。但是,请仔细检查您的“前缀”,如果有前导空格(缩进),您可能需要\s*/web/com....

    • 类似于您的s|pat|rep_or_cmd|e,您可以使用另一个分隔符进行模式匹配,如果您的模式包含斜杠,我们在最后一项中讨论过。所以\@^\s*/web/compile@ 会更容易阅读

    • 来解决。你有两种不同的方式来做你想做的事:

      sed '\@^\s*/web/compile@n; s|your s cmd....|' file
      

        sed '\@^\s*/web/compile@!s|your s cmd....|' file
    

    注意

    在你的问题中,你写的前缀有时web/compile有时/web/compile,你应该在sed命令中写正确的并测试。

    【讨论】:

    • 好的,看起来不错。又一个小问题。如果我想使用另一个 eexcept 怎么办?例如:web/compile/* 和 */fonts/xy
    • @TDex 你的意思是“或”?正则表达式有|
    • 没有。像这样的东西:\@^\sweb/compile@!s|\@^\sfonts/Akrobat@!s|(.*): .*|echo... 所以 web/编译/* AND /fonts/Akrobat
    • @TDex 不,你的意思是 OR /prefixA or prefixB/n; s|yourCmd... “或”这里可以是 |\| 这取决于 -r 选项是否存在。如果你说AND,这意味着一行匹配两条路径,我认为你不是真的。
    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多