linux - 使用 SED 实用程序输出不带替换的匹配模式

标签 linux sed

这个问题与Delete a network profile from wpa_supplicant.conf in Linux (raspbian).有关

使用以下命令,我们可以看到输出为文件的内容,并删除了匹配的 SSID 的网络 block 。

cat network_block_eg.conf | sed -n '1 !H;1 h;$ {x;s/[[:space:]]*network={\n[[:space:]]*ssid="example"[^}]*}//g;p;}'

问题是如何获得与匹配模式一样的输出(在本例中为 network={})。

例如命令输出

network={
    ssid="example"
    proto=WPA
    key_mgmt=WPA-PSK
    pairwise=TKIP
    group=TKIP
    psk="not so secure passphrase"
    wpa_ptk_rekey=600
}

最佳答案

cat network_block_eg.conf | sed -n '/[[:space:]]*network={/ {:a; /}/! {N; ba;}; /ssid="example"/ p}'

sed命令解释,-n抑制正常输出:

/[[:space:]]*network={/ { # in a line that matches start block pattern
  :a                      # 'a' label to jump to
  /}/! {                  # if pattern space not contains end block pattern
    N                     # read next line and add it to pattern space
    ba                    # jump back to 'a' label
  }
  /ssid="example"/ p      # now if pattern space contains your desired ssid, print it out
}

关于linux - 使用 SED 实用程序输出不带替换的匹配模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50620870/

相关文章:

linux - BASH:测试字符串是否有效

regex - 在 Bash 中编辑/匹配某个特定匹配项下方的字符串 n 行?

Python。 sed -e 表达式 #1 : char 11: unterminated 's' command

regex - 在正则表达式匹配之间剪切输出的最有效方法?

linux - Linux时间命令的结果

c++ - 在 Linux 上使用 C++ 记录进程终止的原因

c - shmget 系统调用 [Linux] - 分配字节数?

linux - 在shell命令中绕过文件头的通用解决方案

用于在行范围内替换的 perl 习语(类似 sed)

sed - docker run sed 不起作用