2017-08-24 5 views
0

多くのENV変数を持つファイルを指定します。各行の先頭に単語を追加する方法#があるときではなく

例:DEV.env

TRUST_STORE=/run/secret/truststore.jks 
#TRUST_STORE_PASSWORD=changeit 
[email protected] 

私はコマンドsed "s/^/export /g"は、各行の先頭にexportを追加します知っています。

しかし、私は最初の文字が "#"のときはこれをしたくありません。

どのようにsedを使用できますか?

答えて

1

このような何か:

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

代替:

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

私のアプローチとの違いに注意してください:それは空の行と一致しません。私は要件を理解しています*最初の文字が "#"でない場合、または最初の文字が '# 'でないか、または文字列の最後に続いているので、これをしたくありません。 –

1

あなたは、グループ1に#以外の文字や線の終わりをキャプチャし\1後方参照

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

-rオプション(も-EいくつかのOS上でキャプチャした値を復元します正規表現を使用することができます)は、sedのPOSIX ERE構文を有効にします。

  • ^ - 捕捉基([^#]で)#以外の文字にマッチ#1又はラインの(|)の端部($) - マッチライン
  • ([^#]|$)
  • の開始します。 \1

online demoを参照してください

グループ1でキャプチャされた値を保持します。

1

あなたはこのsed使用することができます。

ここ
sed -i.bak '/^[[:blank:]]*#/!s/^/export /' file 

cat file 
export TRUST_STORE=/run/secret/truststore.jks 
#TRUST_STORE_PASSWORD=changeit 
export [email protected] 

  • /^[[:blank:]]*#/! 0:私たちはラインで#は、オプションの空白
  • s/^/export /以下の起動がある場合にのみ、この操作を行います:行がexport
+0

'/:[[:blank:]] *#/!':これは、** DONT **の行頭にオプションの空白文字の後に '#'をつけた場合にのみ行う。 –

+0

インデントされた行などの行をコメントアウトします。 – anubhava

0

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

必要はありませんキャプチャで始まり交換してください。

関連する問題