给定一个包含许多ENV变量的文件。
示例:DEV.env
TRUST_STORE=/run/secret/truststore.jks
#TRUST_STORE_PASSWORD=changeit
TRUST_STORE_PASSWORD=ch@nge1t
我知道命令sed "s/^/export /g"
会在每行的开头添加export
。
但是,当第一个角色是"#"时,我不想这样做。
我怎么能用sed做什么?
答案 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;'
无需捕捉。