连接以数字开头重复的文本行

连接以数字开头重复的文本行

我想知道是否有人可以帮助我,因为我试图将“使用sed正则表达式”应用于 XML 文件。我觉得这种方法本质上是相似的。

我想将sed命令与以下文件一起使用。

ABC
12345
54321
98765
56789
DEFG
07418
8529
BBBG
12365
9879
8596
7485
NMKL
3652
4523
12345 192.168.1.12
54321 10.10.2.23
98765 192.168.2.52
56789 172.16.2.2
07418 192.168.11.56
8529 10.11.3.55
9879 10.17.25.12
8596 192.168.7.23
7485
3652 172.28.28.1
4523 172.56.56.7

并将其转换成类似的东西

ABC
12345 12345 192.168.1.12
54321 54321 10.10.2.23
98765 98765 192.168.2.52
56789 56789 172.16.2.2
DEFG
07418 07418 192.168.11.56
8529 8529 10.11.3.55
BBBG
12365
9879 9879 10.17.25.12
8596 8596 192.168.7.23
7485 4523 172.56.56.7
NMKL
3652 3652 172.28.28.1
4523 4523 172.56.56.7

甚至更好

ABC
12345 192.168.1.12
54321 10.10.2.23
98765 192.168.2.52
56789 172.16.2.2
DEFG
07418 192.168.11.56
8529 10.11.3.55
BBBG
12365
9879 10.17.25.12
8596 192.168.7.23
7485 172.56.56.7
NMKL
3652 172.28.28.1
4523 172.56.56.7

我确信第一列中的数字显然被视为链接到页面底部 IP 地址的 ID。

id 也属于字母缩写。使用类似的命令

sed -E '$!N;/^(\S+\s+)(.*)\n\1/!P;s//\n\1\2<br>/;D' 

经过一些修改,我觉得我已经很接近了。

我的尝试失败了,例如以下内容

sed -E '$!N;/^([0-9]+)(.*)\n\1/!P;s//\n\1\2 /;D' file.xml

或者

sed -E '$!N;/^([[:digit:]]+)(.*)\n\1/!P;s//\n\1\2 /;D' file.xml

该文件一开始是 XML,我已经慢慢删除了不必要的信息。 ID 号的大小可以增加。所有空间都是单个空间。基本上,我想将缩写下的 ID 号与 IP 地址相对应,并将该 ID 放在缩写下的 IP 地址。

我觉得捕获组并没有选择所有以数字开头的行。我还觉得sed正则表达式可能需要 if 条件,我只是不确定如何实现它。

答案1

正如我在评论中所写的,我觉得你的例子与你的解释不符,但我假设你实际上在寻找类似的东西

sed 'H;x;s/\(\n[0-9]*\)\(\n.*\)*\1\( .*\)$/\1\3\2/;h;$!d;s/^\n//

这个想法是收集保留空间中的所有行并测试最后一行是否以我们之前已有的 ID 开头:

  • H;x意味着我们将所有行附加到保持空间,然后交换保持空间和模式空间。请注意,这会在开头放置一个有用的换行符
  • s/\(\n[0-9]*\)\(\n.*\)*\1\( .*\)$/\1\3\2/查找 ID 行(仅由数字组成)并测试最后附加的行是否与该 ID 匹配。如果是,请将其余行移到 ID 后面。后面*的`(\n.看似无稽之谈,但处理这种情况是必要的,因为 IP 线可能紧接在 ID 线后面。
  • h;$!d将行保存回保留空间并继续下一行而不输出
  • s/^\n//最后删除起始换行符 ;x;s/(\n[0-9])(\n.)\1([0-9 .]*)/\1\3\2/;x;$!d;g;s/^\n//'

扩展正则表达式的更新

如果您想使用扩展正则表达式(选项-E,如您的问题中所示),语法将是

sed 'H;x;s/(\n[0-9]*)(\n.*)*\1( .*)$/\1\3\2/;h;$!d;s/^\n//

但请注意,反向引用 ( ) 不是 POSIX ERE 标准的一部分,因此可能并非所有风格\1都实现它。sed

相关内容