sed删除块

时间:2016-06-29 16:28:10

标签: regex sed

你能帮我用sed从dhcp配置文件中删除一些块吗? 文件看起来像:

host dev1 {
  host-identifier option agent.circuit-id "test1:418";
  fixed-address xxx.xxx.xxx.xxx;
  option routers xxx.xxx.xxx.xxx;
  option subnet-mask xxx.xxx.xxx.xxx;
}
host host2{
  host-identifier option agent.circuit-id "test2-:5";
  fixed-address xxx.xxx.xxx.xxx;
  option routers xxx.xxx.xxx.xxx;
  option subnet-mask xxx.xxx.xxx.xxx;
}

我应该删除由circuit-id匹配的主机的块。我是通过命令做到的:

sed -e '/^host\s*\S*\s*{\s*/ { N; /\s*test1:418/ { N; /[^host]/ { N; /[^host]/ { N; /[^host]/ { N; /[^host]/d}}}}}' -e '/^$/d' /path/to/file

但它似乎根本不可接受...... :(

1 个答案:

答案 0 :(得分:1)

如果这是一个isc dhcp服务器,我强烈建议使用omshell来修改配置。

否则,如果你有GNU gawk,那么以下gawk '!/test2-:5/' RS='}\n' ORS='}\n' file ^----------------------------------- ID goes here 命令对你来说可能已经足够了:

gawk

该命令仅限于GNU }\n,因为它使用多行记录分隔符。

说明:

使用host dev1 { host-identifier option agent.circuit-id "test1:418"; fixed-address xxx.xxx.xxx.xxx; option routers xxx.xxx.xxx.xxx; option subnet-mask xxx.xxx.xxx.xxx; 作为记录分隔符,awk将逐块处理文件,而不是默认的逐行模式。意思是awk会看到这些记录:

host host2{
  host-identifier option agent.circuit-id "test2-:5";
  fixed-address xxx.xxx.xxx.xxx;
  option routers xxx.xxx.xxx.xxx;
  option subnet-mask xxx.xxx.xxx.xxx;

!/test2-:5/

在这些记录中,我们应用正则表达式!。前面的true否定了匹配。我们不需要指定更多,因为如果条件评估为\n},awk将默认打印当前记录。由于第二条记录与模式匹配,因此无法打印。

输出记录分隔符也使用sed在打印时添加结束括号。

顺便说一下,:a我会使用基于标签的循环(/host .*{/)。我们将输入从}开始直到结束},并将所有行附加到模式缓冲区。一旦达到结束sed '/host .*{/{:a;N;/}/!ba;/test2-:5/d}' file ,我们检查模式缓冲区是否包含ID。如果它包含id,它将被删除:

    self.audioSession = AVAudioSession.sharedInstance()
    do {
      try audioSession.setPreferredSampleRate(44100.0)
      try audioSession.setPreferredIOBufferDuration(4410.0 / 44100.0)
      try audioSession.setCategory(AVAudioSessionCategoryRecord)
      try audioSession.setActive(true)
      audioSession.requestRecordPermission() {
        [unowned self] (allowed: Bool) -> Void in
        if allowed {
          self.audioEngine = AVAudioEngine()
          self.audioInputNode = self.audioEngine.inputNode!
          let format: AVAudioFormat = self.audioInputNode.outputFormatForBus(0)
          self.audioInputNode.installTapOnBus(0, bufferSize: UInt32(4410), format: format, block: {
            (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in
            // buffer length is 16384
          })
          do {
            try self.audioEngine.start()
          } catch {}
        } else {...}
      }
    } catch {...}