如何在每行的开头添加一个单词但不在#存在时添加单词

时间:2017-08-24 21:34:58

标签: regex linux shell sed sh

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

示例:DEV.env

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

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

但是,当第一个角色是"#"时,我不想这样做。

我怎么能用sed做什么?

4 个答案:

答案 0 :(得分:1)

你可以使用一个正则表达式来捕获除#之外的字符或行尾的第1组,然后恢复使用\1反向引用捕获的值

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

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

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

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

请参阅online demo

答案 1 :(得分:1)

这样的事情:

$ 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

答案 2 :(得分:1)

您可以使用此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

答案 3 :(得分:0)

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

无需捕捉。