根据括号数删除行?

时间:2015-10-27 17:33:43

标签: linux oracle shell awk sed

我正在尝试找到一种最好的方法来替换一个名为listener.ora的文件中的一些文本用于oracle。主要是寻找替换" SID_LIST_LISTENER_ORCL"进入其他东西...但我有几件事可能会出错,我想避免......

首先,您可以看到条目看起来像条目#1或条目#2,第一个条目有#34; SDU ="输入,而第二个不要...请注意文件将具有条目#1或条目#2而不是两个同时(至少不在我们的环境中)。

其次,我想的是找到" SID_LIST_LISTENER_ORCL"从那里删除6或7行,但由于条目不同(SDU =一个而不是其他),我认为这不是一个好主意......

接下来的事情,无论我能想出什么,我都可能会找到一个环境,可能会在该条目中再说两行,那么我的脚本会破坏或导致其他错误....所以有一个很好的对于这两个条目以及我将来可能会遇到的任何其他东西都有用的东西...我能想到的一个重要的事情是,无论它有多少行,它有6,7,9或9它总是会有一个确切的开始和结束括号的数字{()} ...从&#34开始;(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 个答案:

答案 0 :(得分: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