【问题标题】:Update YAML parameter file from CLI从 CLI 更新 YAML 参数文件
【发布时间】:2021-01-14 21:53:27
【问题描述】:

我有一个关于从 CLI 更新 mkdocs YAML 文件的问题。 YAML 文件有以下字符串:

...
site_name: Material for MkDocs
...

我需要的是操纵site_name参数:

  1. 在前面添加src/
  2. 从参数中删除所有空格和特殊字符。

输出应该是:

...
site_name: src/MaterialforMkDocs
#OR
site_name: src/Material_for_MkDocs
...

我做了以下操作,看起来它正在工作:

newSiteName=$(grep "site_name:" mkdocs.yml | sed 's/ //g' | sed 's/[^a-z  A-Z 0-9 _]//g' | sed 's/site_name/site_name: src\//')

sed -i "s|site_name:.*|$newSiteName|" mkdocs.yml

我坚信这可以通过非常简单的方式解决。

【问题讨论】:

    标签: linux sed yaml command-line-interface


    【解决方案1】:

    一次调用 sed:

    sed -E '
        /^[[:blank:]]*site_name:[[:blank:]]*/ {
            h                       ;# copy the line
            s///                    ;# remove the previous regex
            s/[[:blank:]]+/_/g      ;# convert whitespace to underscores
            s,^,src/,               ;# add the prefix
            x                       ;# swap hold and pattern spaces
            s/:.*/: /               ;# remove the value
            G                       ;# append the hold space
            s/\n//                  ;# remove the newline
        }
    ' mkdocs.yml
    

    如果它看起来正确;添加-i 选项。

    【讨论】:

    • 太棒了!只剩下一点,它不会删除特殊字符,例如如果我在参数中有Mk!Docs,它将离开,所以我更新您的呼叫并在您的呼叫中的s/// 之后添加s/[^a-z A-Z 0-9 _]//g ;# remove special characters,它就可以工作了!输入site_name: Material for Mk!Docs 输出site_name: src/Material_for_MkDocs
    • [^[:alnum:]_] 更简洁但同样具有描述性。
    【解决方案2】:

    您还可以使用yq - 一个专门用于 yaml 文档的工具,包括编辑前端:

    yq e --front-matter=process '.site_name |= "src/" + sub("[^a-zA-Z]", "")' file.yaml
    

    https://mikefarah.gitbook.io/yq/usage/front-matter#process-front-matter

    披露:我写了 yq

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2011-12-13
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      相关资源
      最近更新 更多