【问题标题】:How to add a word at the beginning of each line BUT not when a # is present如何在每行的开头添加一个单词,但不是在出现 # 时
【发布时间】:2018-02-02 21:42:37
【问题描述】:

给定一个包含许多 ENV 变量的文件。

示例:DEV.env

TRUST_STORE=/run/secret/truststore.jks
#TRUST_STORE_PASSWORD=changeit
TRUST_STORE_PASSWORD=ch@nge1t

我知道命令sed "s/^/export /g" 将在每行的开头添加export

但是当第一个字符是“#”时我不想这样做。

我如何使用 sed?

【问题讨论】:

    标签: regex linux shell sed sh


    【解决方案1】:

    echo "abc" | perl -ne 's/^(?!#)/export /g; print;'

    无需捕获。

    【讨论】:

      【解决方案2】:

      类似这样的:

      $ sed "s/^[^#]/export &/g"
      export TRUST_STORE=/run/secret/truststore.jks
      #TRUST_STORE_PASSWORD=changeit
      export TRUST_STORE_PASSWORD=ch@nge1t
      

      替代方案:

      $ sed "/^[^#]/ s/^/export /g"
      $ sed "/^#/n; s/^/export /g"  #n : read the next line
      

      【讨论】:

      • 请注意与我的方法的区别:它不匹配空行。我理解要求当第一个字符是“#”时我不想这样做,因为第一个字符不是# 或者后面跟着字符串的结尾。
      【解决方案3】:

      你可以使用这个sed

      sed -i.bak '/^[[:blank:]]*#/!s/^/export /' file
      
      cat file
      export TRUST_STORE=/run/secret/truststore.jks
      #TRUST_STORE_PASSWORD=changeit
      export TRUST_STORE_PASSWORD=ch@nge1t
      

      这里:

      • /^[[:blank:]]*#/!:只有当我们在可选空格之后的行开头有 # 时才这样做
      • s/^/export /:将行开头替换为export

      【讨论】:

      • /^[[:blank:]]*#/!:仅当我们DONT在可选空格之后的行开头有#时才这样做
      • 在一行中的几个空格(如缩进行)之后放置 # 是完全有效的。
      【解决方案4】:

      您可以使用正则表达式将# 以外的字符或行尾捕获到第 1 组,然后恢复使用 \1 反向引用捕获的值

      sed -r "s/^([^#]|$)/export \1/"
      

      -r 选项(在某些操作系统上也是 -E)启用 sed 中的 POSIX ERE 语法。

      • ^ - 匹配行首
      • ([^#]|$) - 与#[^#])或(|)行尾($)以外的字符匹配的捕获组#1。

      \1 保存第 1 组捕获的值。

      请参阅online demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 2011-04-15
        相关资源
        最近更新 更多