数字で始まる繰り返しテキスト行の連結

数字で始まる繰り返しテキスト行の連結

sedXMLファイルに「正規表現の使用」を適用しようとしたときに誰でも私を助けることができるかどうか疑問に思います。私はこのアプローチが本質的に似ていると思います。

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アドレスの略語に入れたいと思います。

キャプチャグループが数字で始まるすべての行を選択していないようです。また、正規表現にif条件が必要かもしれないと思いますがsed、これを実装する方法がわかりません。

ベストアンサー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

おすすめ記事