2017-05-20 69 views
0

我正在編寫一個腳本,用於取消文件中幾行代碼的註釋。這就是我想要取消註釋:取消sed代碼

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

所以,我做我的研究,發現了這個命令是做什麼我在尋找:

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

那麼我將如何調整它做的事我在找什麼?我已經嘗試在命令內部粘貼文本,盡我所能避免所有引號,但似乎並不奏效。

+0

''只是一個正則表達式的佔位符,用於匹配要取消註釋的行(和*僅*這些行)。不幸的是,很難說這個表達應該是什麼;所顯示的兩條線沒有太多共同之處,我們不知道您*不希望匹配的其他行可能出現在文件中。用數字範圍(比如'6,7')替換'/ /'可能會更容易,以匹配您想取消註釋的行號。 – chepner

+0

是的,我知道''。另外,我不需要在一個命令中取消兩條線的註釋。 – PoVa

+2

關於你的最後一句話,你究竟做了什麼?你是什​​麼意思,它不*看起來*工作?它要麼取消註釋所需的行,要麼沒有註釋。 – chepner

回答

4

評論的是評論,而不是流量控制。

而不是試圖修改文件以切換這些行,通過環境變量控制它們的執行。

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

現在,如果變量enable_ruby設置爲環境中的任何值,PATH將被修改,並且被配置ruby。否則,這兩行將被忽略。

$ 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 

無論目標字符串包含什麼字符,以上都將起作用。