bash - sed 处理烦人的文本

标签 bash unix sed

我有以下输出:

    [root@localhost:~]# setkey -DP
    (per-socket policy)
            Policy:[Invalid direciton]
            created: Feb  5 09:25:06 2013  lastused: Feb  5 10:25:10 2013
            lifetime: 0(s) validtime: 0(s)
            spid=411 seq=1 pid=4415
            refcnt=1
    (per-socket policy)
            Policy:[Invalid direciton]
            created: Feb  5 09:25:06 2013  lastused: Feb  5 10:13:21 2013
            lifetime: 0(s) validtime: 0(s)
            spid=420 seq=2 pid=4415
            refcnt=1
    192.168.111.0/24[any] 192.168.0.0/24[any] any
            out prio def ipsec
            esp/tunnel/94.243.123.241-89.28.12.86/require
            created: Feb  5 09:25:13 2013  lastused: Feb  5 09:25:44 2013
            lifetime: 0(s) validtime: 0(s)
            spid=441 seq=3 pid=4415
            refcnt=1
    192.168.0.0/24[any] 192.168.111.0/24[any] any
            in prio def ipsec
            esp/tunnel/89.28.12.86-94.243.123.241/require
            created: Feb  5 09:25:13 2013  lastused:
            lifetime: 0(s) validtime: 0(s)
            spid=448 seq=4 pid=4415
            refcnt=1
    192.168.0.0/24[any] 192.168.111.0/24[any] any
            fwd prio def ipsec
            esp/tunnel/89.28.12.86-94.243.123.241/require
            created: Feb  5 09:25:13 2013  lastused:
            lifetime: 0(s) validtime: 0(s)
            spid=458 seq=0 pid=4415
            refcnt=1

我只想从中得到这一行:

    192.168.111.0/24 192.168.0.0/24

不了解行的位置

我已经进行了以下正则表达式构造,但它们不起作用:

    [root@localhost:~]# setkey -DP | sed -rne 's/^(([0-9]{1,3}\.){3}[0-9]{1,3})(\/[0-9]{1,2}).*(([0-9]{1,3}\.){3}[0-9]{1,3})(\/[0-9]{1,2})/\1\2\3\4/p'
    192.168.111.0111./242.168.0.0[any] any
    192.168.0.00./242.168.111.0[any] any
    192.168.0.00./242.168.111.0[any] any

    [root@localhost:~]# setkey -DP | sed -rne 's/^(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}).*(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2})/\1\2/p'
    192.168.111.0/24111.[any] any
    192.168.0.0/240.[any] any
    192.168.0.0/240.[any] any

错误在哪里?

预先感谢您,叶夫根尼

最佳答案

我宁愿分别找到每组数字,可能是这样的:

sed -rn 's|[^0-9]*(([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2})|\1\n|g; s/\n[^\n]*$//; s/\n/ /gp'

输出:

192.168.111.0/24 192.168.0.0/24
192.168.0.0/24 192.168.111.0/24
192.168.0.0/24 192.168.111.0/24

但是,如果您想匹配这对组,您可以将第二个正则表达式更改为:

sed -rne 's/^(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2})[^0-9]*(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}).*/\1 \3/p'
  1. 使用否定组[^0-9]*在数字组之间进行非贪婪匹配。
  2. 在末尾添加 .* 以匹配数字组后面的所有内容。
  3. 您想要用第一个和第三个反向引用(\1\3)替换所有内容。反向引用根据其起始括号的位置进行编号。

关于bash - sed 处理烦人的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14703130/

相关文章:

c - 信号量和标准输出缓冲区

linux - 每次文件达到特定大小时使文件无效的 Shell 脚本

c - 与dup2(),exec()和管道混淆

Bash 脚本,比较数字

linux - Bash 脚本 - 仅更改一列中的值

linux - 如何对多个文件夹和子文件夹中的文件运行 dos2unix 命令?

shell - 使用 sed 将时间戳替换为日期

linux - 如何在同一文件中添加行数

regex - 从日志文件中删除日期

linux - cURL Bash 将响应主体保存到文件