特殊文字({&})の間にパターンマッチングが発生する必要がある場合は、特殊文字間にデータを印刷するには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_description
はMulti Lookup
。その場合、perl
使用できる素晴らしいトリックがあります。
Perlには、レコード(行)が空白行として定義される「短絡モード」があります。したがって、各後ろに改行文字を追加すると、}
簡単に次のようにできます。
sed 's/}/}\n/' file | perl -00ne '/service_description\s*Multi Lookup/ && print'
sed
Perlは段落モードをオンにし、各入力行(ここでは行は段落を意味します)を読み取り、与えられたスクリプトを適用します。結果は一致するレコードを印刷することです。\n
}
-00
-ne
-e
service_description
Multi 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.txt
inputfile.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要素の繰り返しを使用して、目的の一致(水平スペースを表す)を見つけると、その要素が表示されます。}
comb
for
if
\h
put
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
}
使用される検索正規表現を単純化するために、comb
Rakuの~
チルダ表記を使用して代替を提供する一致する区切り文字(中括弧、角括弧、大括弧など)を見つけることができます[ \{ ~ \} <-[ } ]>* ]
。また、Rakuのslurp
edデータの内部表現を表示するには、次のように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