2015-10-18 44 views
-1

後:添加註釋和新行我已經在我的個人資料下面的行匹配的文本

export JAVA_HOME=/usr/bin/java 

我怎麼能評論這行,這行後添加一個新行。

預期的結果:

#export JAVA_HOME=/usr/bin/java 
export JAVA_HOME=${java_path} 

我已經試過這

我嘗試以下sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt添加評論僅當它不存在,但不工作

謝謝提前

+1

你嘗試過什麼來解決這個問題? –

+0

我試過如下 sed -e'/ export JAVA_HOME =/usr/bin/java/s/^#* /#/' MO12

+2

請點擊「編輯」並將其放入問題中,而不是評論。 –

回答

1

請嘗試以下操作(假定爲GNU Sed):

sed -r '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\n\1${java_path}/}' file.txt 

隨着BSD(OSX)桑達(也應該與GNU桑達工作),事情變得更加複雜(假設bashksh,或zsh作爲外殼,由於採用的$'\n',一個ANSI C-quoted string,以產生一個面值換行符炭):

sed -E '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt 

A(希望)符合POSIX標準溶液(又一個更復雜一點;還假定bashksh,或zsh作爲殼):

sed '\|^\(export JAVA_HOME=\)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt 

正如你所看到的,不同的sed實現需要不同的解決方案,因此,特別是sedawk,但與一般的Unix工具,它的建議提及其平臺或明確要求跨平臺兼容的解決方案。

注:通常情況下,/.../用於分隔在sed命令的正則表達式,但也可以選擇不同的分隔符,如果你想避免逃避/字符是有幫助的。在正則表達式本身。在這裏,我選擇| - 注意:開幕|必須\轉義(你做s///選擇備選分隔符,必須這樣做)。


至於爲什麼你的命令sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt沒有工作

  • 你忘了躲避/字符。在正則表達式\/,這是必要的,因爲您的Sed地址使用/作爲正則表達式分隔符

  • s/^#*/#/查找零個或多個上匹配的行現有#字符,並與剛剛#替換它們 - 在特定情況下,無操作。

    • 如果你想s的函數,在什麼情況下地址匹配(在此選擇匹配行腳本開始正則表達式),您必須使用emtpy正則表達式隱含操作,即s//.../,如在上面的解決方案中。
    • 要引用替換文本中的匹配文本,您必須使用&;如果有捕捉組,在上述方案中,您可以參考一下他們​​的指標捕捉:\1指第一組,...
+1

謝謝,這工作。我做了一個'sed -i.bak'來備份存在文件,並且多次運行該命令以確保它不會一次又一次地追加同一行。 – MO12

相關問題