0

ファイル内にいくつかの情報を含むスカラー変数があります。私の目標は、その変数 (またはファイル) から、"Administratively down" という単語を含む複数行のエントリを削除することです。

形式は次のようになります。

Ethernet2/3 is up
... see middle ...
a blank line
VlanXXX is administratively down, line protocol is down
... a bunch of text indented by two spaces on multiple lines ...
a blank line
Ethernet2/5 is up
... same format as previously ...

「管理上ダウン」と先頭の改行(空白行)を一致させることができれば、変数にロジックを適用して、それらの行の間の行も削除できると考えていました。

私は現在Perlを使用していますが、これを行うiosの方法を誰かが教えてくれれば、それもうまくいくでしょう.

4

3 に答える 3

4

Perl の段落モードを使用する

Perl には、空白行をレコード区切りとして使用するためのめったに使用されない構文があります-00。詳細については、perl(1)のコマンド スイッチを参照してください。

たとえば、次のコーパスがあるとします。

Ethernet2/3 is up
... see middle ...

VlanXXX is administratively down, line protocol is down
... a bunch of text indented by two spaces on multiple lines ...

Ethernet2/5 is up

次のワンライナーで、不要なものを除くすべてのパラグラフを抽出できます。

$ perl -00ne 'print unless /administratively down/' /tmp/corpus

サンプル出力

コーパスに対してテストすると、ワンライナーは次のようになります。

Ethernet2/3 is up
... see middle ...

Ethernet2/5 is up
于 2013-08-08T17:47:42.967 に答える
0

それで、「administratively down」を含む行の先頭から、次の空白行 (2 つの連続した改行) までを削除したいですか?

$log =~ s/[^\n]+administratively down.+?\n\n//s;

s/= 正規表現置換

[^\n]+= 改行を含まない任意の数の文字の後に続く

administratively down= リテラルテキスト、その後に続く

.+?= 任意の量のテキスト (改行を含む) は貪欲に一致せず、その後に続く

\n\n= 2 つの改行

//= 何も置き換えない (つまり、削除する)

s= 単一行モード、.改行の一致を許可します (通常は一致しません)

于 2013-08-08T17:34:25.487 に答える
0

次のパターンを使用できます。

(?<=\n\n|^)(?>[^a\n]++|\n(?!\n)|a(?!dministratively down\b))*+administratively down(?>[^\n]++|\n(?!\n))*+

詳細:

(?<=\n\n|^)  # preceded by a newline or the begining of the string
# all that is not "administratively down" or a blank line, details:
(?>                               # open an atomic group
    [^a\n]++                      # all that is not a "a" or a newline
  |                               # OR
    \n(?!\n)                      # a newline not followed by a newline
  |                               # OR
    a(?!dministratively down\b)   # "a" not followed by "dministratively down"
)*+                               # repeat the atomic group zero or more times
administratively down             # "administratively down" itself
# the end of the paragraph
(?>                          # open an atomic group          
    [^\n]++                  # all that is not a newline
  |                          # OR
    \n(?!\n)                 # a newline not followed by a newline
)*+                          # repeat the atomic group zero or more times
于 2013-08-08T17:34:32.707 に答える