2015-10-27 42 views
0

我想找到一個最佳方法來替換名爲listener.ora for oracle的文件中的一些文本。主要是想用別的東西取代「SID_LIST_LISTENER_ORCL」條目......但我有幾件事情可能會出錯,我想避免...刪除基於括號數的行嗎?

首先,你可以看到條目看起來像條目# 1或條目#2,第一個具有「SDU =」條目,而第二個不要...注意該文件將具有條目#1或條目#2,並且不是同時(兩者不是同時)(至少不是在我們的環境中)。第二,我在想的是做一個「SID_LIST_LISTENER_ORCL」的查找並從那裏刪除6或7行,但由於條目不同(SDU =在一個而不在其他),我不認爲它是一個好主意。 ..

接下來的事情,無論我能想出什麼,我可能會發現一個環境,可能讓說,在該條目2多行,然後我的腳本將打破或導致其他錯誤....所以這將是很高興有一些東西可以用於這兩個條目,以及我將來可能遇到的其他任何東西......我可以想到的一個重要的事情是,無論它有多少行6,7,9或9,它總是會有一個確切的開始和結束括號{()}的數字......從「(SID_LIST =」

我知道我想要替換和我有這部分制定了但如何刪除現有生產線

### Entry #1 

SID_LIST_LISTENER_ORCL = 
    (SID_LIST = 
    (SID_DESC = 
     (SDU = 32768) 
     (SID_NAME = ORCL) 
     (ORACLE_HOME = /oracle/ORCL/11264) 
    ) 
) 

## Entry #2 

SID_LIST_LISTENER = 
    (SID_LIST = 
    (SID_DESC = 
     (SID_NAME = ORCL) 
     (ORACLE_HOME = /oracle/ORCL/11264) 
    ) 
) 

完整的listener.ora文件通常是這樣的掙扎......

LISTENER_ORCL = 
    (DESCRIPTION_LIST = 
    (DESCRIPTION = 
     (ADDRESS_LIST = 
     (ADDRESS = 
      (PROTOCOL = TCP) 
      (HOST = hostname) 
      (PORT = 1578) 
    ) 
    ) 
) 
) 

STARTUP_WAIT_TIME_LISTENER_ORCL = 0 
CONNECT_TIMEOUT_LISTENER_ORCL = 10 
TRACE_LEVEL_LISTENER_ORCL = OFF 
SID_LIST_LISTENER_ORCL = 
    (SID_LIST = 
    (SID_DESC = 
     (SDU = 32768) 
     (SID_NAME = ORCL) 
     (ORACLE_HOME = /oracle/ORCL/11204) 
    ) 
) 

回答

1

這將刪除同一行中匹配括號的內容。我不確定那是你的問題。

$ sed '/(.*)/d' file 

將打印

SID_LIST_LISTENER_ORCL = 
    (SID_LIST = 
    (SID_DESC = 
    ) 
) 

## Entry #2 

SID_LIST_LISTENER = 
    (SID_LIST = 
    (SID_DESC = 
    ) 
) 

更新的完整文件。

爲此,最好切換到awk其功率。

$ awk -v RS= -F"\n" '!/SID_LIST_LISTENER/{print} 
         /SID_LIST_LISTENER/{for(i=1;i<=NF;i++) 
            if($i!~/\(.*\)/) print $i}' listener.ora 

只會在所需的上下文中刪除匹配的圓括號。

LISTENER_ORCL = 
    (DESCRIPTION_LIST = 
    (DESCRIPTION = 
     (ADDRESS_LIST = 
     (ADDRESS = 
      (PROTOCOL = TCP) 
      (HOST = hostname) 
      (PORT = 1578) 
    ) 
    ) 
) 
) 
STARTUP_WAIT_TIME_LISTENER_ORCL = 0 
CONNECT_TIMEOUT_LISTENER_ORCL = 10 
TRACE_LEVEL_LISTENER_ORCL = OFF 
SID_LIST_LISTENER_ORCL = 
    (SID_LIST = 
    (SID_DESC = 
    ) 
) 

更新2,刪除全部記錄

$ awk -F"\n" -v RS= '/SID_LIST_LISTENER/{sub("SID_LIST_LISTENER.*","")}1' listener.ora 
LISTENER_ORCL = 
    (DESCRIPTION_LIST = 
    (DESCRIPTION = 
     (ADDRESS_LIST = 
     (ADDRESS = 
      (PROTOCOL = TCP) 
      (HOST = hostname) 
      (PORT = 1578) 
    ) 
    ) 
) 
) 
STARTUP_WAIT_TIME_LISTENER_ORCL = 0 
CONNECT_TIMEOUT_LISTENER_ORCL = 10 
TRACE_LEVEL_LISTENER_ORCL = OFF 
+0

我不認爲這會工作,因爲它會刪除「LISTENER_ORCL」部分中的所有其他條目... –

+0

我想,會做這個訣竅,但是你知道如何擺脫5條線以後?我想我可以使用sed刪除這5行,但我可能最終刪除錯誤的行,如果我只是說刪除最後5行... –

+0

哪5行?您是否要刪除完整記錄SID_LIST_LISTENER_ORCL? – karakfa