试图理解sed脚本中的嵌套括号

时间:2011-03-11 15:01:15

标签: bash shell sed

/^Host.*latency.*/{
    $!N
    /MAC Address/{
        s/.*(\(.*\)) .*MAC Address: \(.*\) .*/\1 -> \2/
    }
}  
/[Nn]map/d
s/^Host .*is up/& but MAC Address cannot be found/

我试图理解上面的sed脚本。可以帮助我理解我从未使用过如上所述的sed。 它的用途是

nmap -sP 192.168.1.0/20 | sed -f sedcript.sh

1 个答案:

答案 0 :(得分:3)

如果您的意思是(\(.*\))中的嵌套括号。外部对是文字的,内部的转义对捕获由封闭的正则表达式匹配的字符串。反向引用\1输出此捕获的字符串。 \2反向引用输出由第二对转义括号捕获的字符串。

如果你的意思是花括号,它们会围绕命令块。外部组表示如果该行匹配^Host.*latency.*,则执行随附的命令。如果当前行不是最后一行,$!N命令会附加文件的下一行。如果行的组合与MAC Address匹配,则执行下一对花括号内的块(执行替换)。

你可以这样读:

  • /^Host.*latency.*/{ - 如果该行与此正则表达式匹配,那么
    • $!N - 如果当前行不是最后一行,则附加下一行
    • /MAC Address/{ - 如果组合的行匹配此正则表达式,则
      • s/.*(\(.*\)) .*MAC Address: \(.*\) .*/\1 -> \2/ - 进行此替换
    • } - 如果
    • 结束
  • } - 如果
  • 结束
  • /[Nn]map/d - 如果模式空间(组合线)与此匹配,则将其删除
  • s/^Host .*is up/& but MAC Address cannot be found/ - 进行此替换