2017-05-20 3 views
0

ファイルから数行のコードをコメント解除するスクリプトを作成しています。これは私がコメントを解除しようとしているものです:sedによるコードのコメント解除

#export PATH="$HOME/.rbenv/bin:$PATH" 
#eval "$(rbenv init -)" 

だから私は私の研究を行なったし、私が探していこのコマンドが見つかりました:

sed -i '/<pattern>/s/^#//g' file 

それでは、どのように私はそれを行うに調整します私が探しているのは?私はコマンド内のテキストを貼り付けてみましたが、すべての引用符をエスケープするために最善を尽くしましたが、うまくいかないようです。

+0

」は、コメントを外したい行(と*のみ*の行)と一致する正規表現のプレースホルダです。残念ながら、その表現がどんなものであるべきかを言うのは難しいです。表示されている2行にはあまり共通点がなく、一致させたくない他の行がファイル内に表示されることはありません。 '/ /'を数値範囲( '6,7 'など)に置き換えて、コメントを外したい行番号と一致させる方が簡単かもしれません。 – chepner

+0

ええ、私は ''について知っています。また、1つのコマンドで両方の行のコメントを解除する必要はありません。 – PoVa

+2

最後の文章について、あなたは何をしようとしましたか?あなたはそれが働くように見えなかったという意味ですか?それは、必要な行のコメントを外したか、そうしなかったかのどちらかです。 – chepner

答えて

4

コメントはのコメントで、フロー制御ではありません。

これらの行を切り替えるためにファイルを変更するのではなく、環境変数を使用して実行を制御します。可変enable_ruby環境における任意値に設定されている場合

if [[ -v enable_ruby ]]; then 
    export PATH="$HOME/.rbenv/bin:$PATH" 
    eval "$(rbenv init -)" 
fi 

次に、PATHが変更とrubyが構成されます。それ以外の場合、これらの2行は無視されます。

$ bash myScript    # Don't do the ruby stuff 
$ enable_ruby=1 bash myScript # Do the ruby stuff 
$ export enable_ruby=   # The empty string is sufficient 
$ bash myScript    # Do the ruby stuff 
$ unset enable_ruby 
$ bash myScript    # Don't do the ruby stuff 
+0

私はあなたの声明に同意しますが、これを行う方法は考えられません。私が編集しているファイルは '.zshrc'(新しい端末インスタンスを開くたびに実行されるファイル)です。ですから、 'enable_ruby'変数を何かに設定したいのであれば、同じファイルに設定します。しかし、それはあなたの言及された声明の前にしなければならないでしょう、そして、それは私が問題を見る場所です。 – PoVa

+1

'.zshrc'の前にソース化されたファイルがいくつかあります。最も関連性の高いファイルは' .zshenv'です。それに 'export enable_ruby = 1'を追加するだけです。 – chepner

3

@ThomasKühnが指摘しているように、慎重に面倒にsedのパターンをエスケープする必要があります。

スマートに仕事をする代わり、難しくない、とあなたは事前にラインマークアップできるかどうかを確認:

#export PATH="$HOME/.rbenv/bin:$PATH" # setrbpath 
#eval "$(rbenv init -)"     # runrbinit 

を今、あなたはちょうどsed -i -e '/setrbpath/s/^#//' file、それはテンプレートファイルに小さな変更に対して安定していることだろうことができます。

+0

それは良いアドバイスです! –

0

この仕事をロバストに行うには、文字列操作でawkを使用してください。これらの入力ファイルを考える:

$ cat file1 
#export PATH="$HOME/.rbenv/bin:$PATH" 
#eval "$(rbenv init -)" 

$ cat file2 
This is what I'm trying to uncomment: 

#export PATH="$HOME/.rbenv/bin:$PATH" 
#eval "$(rbenv init -)" 

So I did my research and found this command that does what I'm looking for 

これはあなたが必要とするすべてである:

$ awk 'NR==FNR{a[$0];next} $0 in a{sub(/./,"")} 1' file1 file2 
This is what I'm trying to uncomment: 

export PATH="$HOME/.rbenv/bin:$PATH" 
eval "$(rbenv init -)" 

So I did my research and found this command that does what I'm looking for 

またはターゲット文字列が、行全体として常に代わりのミッドラインを表示される可能性の場合:

$ awk 'NR==FNR{a[$0];next} {for (i in a) if (s=index($0,i)) $0=substr($0,1,s-1) substr($0,s+1)} 1' file1 file2 
This is what I'm trying to uncomment: 

export PATH="$HOME/.rbenv/bin:$PATH" 
eval "$(rbenv init -)" 

So I did my research and found this command that does what I'm looking for 

上記は、ターゲット文字列に含まれる文字に関係なく機能します。

関連する問題