特殊文字間のパターンを見つける

特殊文字間のパターンを見つける

特殊文字({&})の間にパターンマッチングが発生する必要がある場合は、特殊文字間にデータを印刷するにはSed / awkコマンドが必要です。

次のファイルがあります。

define service {
host_name                       dns_vips
service_description             Multi Lookup 
use                             standard_service_template
active_checks_enabled           1
passive_checks_enabled          1
notifications_enabled           1
contact_groups                  mailgrp
max_check_attempts              3
normal_check_interval           5
retry_check_interval            1
notification_interval           10
check_period                    24x7
notification_period             24x7
notification_options            w,r,c
}
define service {
host_name                       dns_vips1
service_description             Multi Lookup 2  
use                             standard_service_template
active_checks_enabled           1
passive_checks_enabled          1
notifications_enabled           1
contact_groups                  mailgrp1
max_check_attempts              3
normal_check_interval           5
retry_check_interval            1
notification_interval           10
check_period                    24x7
notification_period             24x7
notification_options            w,r,c
}

{多重照会を通じて期間と期間のデータを照合するためのサービス記述が必要です。}

答え1

sed '
    /{/{            #starts next code block if line include «{» 
        :1          #set mark point 
        /}/!{       #execute if pattern (collected lines) do not include «}»
            N       #add next line to the pattern space
            b1      #return to marked point
            }       #end of second (inner) block of code
        }           #end of first block of code 
    /Multi Lookup/p #prints pattern (collected lines) if it has «Multi Lookup»
    d               #clean pattern (start from the beginning)
' file

答え2

私が正しく理解した場合、あなたのすべてのデータがそこにあり、{ }あなたservice_descriptionMulti Lookup。その場合、perl使用できる素晴らしいトリックがあります。

Perlには、レコード(行)が空白行として定義される「短絡モード」があります。したがって、各後ろに改行文字を追加すると、}簡単に次のようにできます。

sed 's/}/}\n/' file | perl -00ne '/service_description\s*Multi Lookup/ && print'

sedPerlは段落モードをオンにし、各入力行(ここでは行は段落を意味します)を読み取り、与えられたスクリプトを適用します。結果は一致するレコードを印刷することです。\n}-00-ne-eservice_descriptionMulti Lookup

$/あるいは、Perlのレコード区切り文字(「行」が何であるかを定義)、スクリプト自体の変数を設定してその手順を回避するsedこともできます。

perl -ne 'BEGIN{$/="}\n"}/service_description\s*Multi Lookup/ && print' file

答え3

ただ楽しくvimして線にしてみました。 (誰がそのような話を聞いたことがありますか?)

vim -c 'g/service_description\s\+Multi Lookup\s\+$/?{?+,/}/-w! >> outputfile.txt' -c 'q!' inputfile.txt

機能:service_description[空白] [空白、行末]を含む各行を検索し、文字を含む行を除いて、各Multi Lookup一致の前後にすべての行を出力し、出力行を作成します。その後、修正なしで終了します。{}{}outputfile.txtinputfile.txt

一致させたいかどうかわかりませんMulti Lookup 2。その場合は、\s\+$以下を削除してくださいMulti Lookup

中かっこ付きの行も含めるには、+?{?-次を削除します/}/

ただ使えるので少し過剰かもしれませんが、sed私にとっては良い練習でした。 :)

答え4

使用幸せ(以前のPerl_6)

~$ raku -e '.put if /service_description \h+ Multi \h Lookup/ for slurp.comb(/^^ define \h service \h \{  <-[ } ]>* \} $$ /);'  file

#OR (more simply)

~$ raku -e '.put if /DESIRED_MATCH/ for slurp.comb( / ^^START <-[ END_char ]>* END$$ /);' 

上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。コードを右から左に読み込むRakuは、slurp一度にファイルをメモリに読み込み、そのcomb逆も可能です。split選ぶ同じテキストブロックを削除するのではなく、テキストブロックを一致させるために使用されます。このアプローチでは、目的のテキストブロック間に不要な文字があるかどうかを選択することは区別されません。

^^行の開始と$$行末のアサーションは具体性を提供するために使用され、ブロック内の文字の使用は、閉じる中括弧を除くすべての文字<-[ } ]>*(0個以上)を含む負の文字クラスであると定義されます。 ed要素の繰り返しを使用して、目的の一致(水平スペースを表す)を見つけると、その要素が表示されます。}combforif\hput

OPの入力ファイル(負の制御を提供するために2番目のカールブロックを変更)が与えられた場合は、次のような出力が得られます。

入力例:

define service {
host_name                       dns_vips
service_description             Multi Lookup 
use                             standard_service_template
active_checks_enabled           1
passive_checks_enabled          1
notifications_enabled           1
contact_groups                  mailgrp
max_check_attempts              3
normal_check_interval           5
retry_check_interval            1
notification_interval           10
check_period                    24x7
notification_period             24x7
notification_options            w,r,c
}
define service {
host_name                       dns_vips1
service_description             Single Lookup
use                             standard_service_template
active_checks_enabled           1
passive_checks_enabled          1
notifications_enabled           1
contact_groups                  mailgrp1
max_check_attempts              3
normal_check_interval           5
retry_check_interval            1
notification_interval           10
check_period                    24x7
notification_period             24x7
notification_options            w,r,c
}

出力例:

define service {
host_name                       dns_vips
service_description             Multi Lookup 
use                             standard_service_template
active_checks_enabled           1
passive_checks_enabled          1
notifications_enabled           1
contact_groups                  mailgrp
max_check_attempts              3
normal_check_interval           5
retry_check_interval            1
notification_interval           10
check_period                    24x7
notification_period             24x7
notification_options            w,r,c
}

使用される検索正規表現を単純化するために、combRakuの~チルダ表記を使用して代替を提供する一致する区切り文字(中括弧、角括弧、大括弧など)を見つけることができます[ \{ ~ \} <-[ } ]>* ]。また、Rakuのslurpedデータの内部表現を表示するには、次のようにif条件を削除して使用してください.raku.put

~$ raku -e '.raku.put for slurp.comb(/^^ define \h service \h [ \{ ~ \} <-[ } ]>* ]  $$/);'  file
"define service \{\nhost_name                       dns_vips\nservice_description             Multi Lookup \nuse                             standard_service_template\nactive_checks_enabled           1\npassive_checks_enabled          1\nnotifications_enabled           1\ncontact_groups                  mailgrp\nmax_check_attempts              3\nnormal_check_interval           5\nretry_check_interval            1\nnotification_interval           10\ncheck_period                    24x7\nnotification_period             24x7\nnotification_options            w,r,c\n}"
"define service \{\nhost_name                       dns_vips1\nservice_description             Single Lookup\nuse                             standard_service_template\nactive_checks_enabled           1\npassive_checks_enabled          1\nnotifications_enabled           1\ncontact_groups                  mailgrp1\nmax_check_attempts              3\nnormal_check_interval           5\nretry_check_interval            1\nnotification_interval           10\ncheck_period                    24x7\nnotification_period             24x7\nnotification_options            w,r,c\n}"

slurpファイルを一度にインポートできない場合は、lines.join("\n")以下を試してください。可能メモリ効率を向上させます。さらに、この回答はRakuのハッシュデータ構造を使用して書き換えることができるため、%さまざまなキーと値のペアをより効率的に分析できます。

https://docs.raku.org/言語/regexes#Tilde_for_nesting_structs
https://docs.raku.org
https://raku.org

関連情報