説明する

説明する

ファイルaから角かっこ行を印刷できます。

first
[
third
fourth
]
sixth
[
eighth 
]
tenth

することで

% <a sed -n '/\[/,/\]/p' 

印刷

[
third
fourth
]
[
eighth
]

しかし、2番目のゲームだけが欲しい場合はどうなりますか?最後の3つですか?

答え1

awkで定義されたブロックがそれ自体ブロックを含まないか、ブロック内にあると仮定すると、使いやすくなります。[][]

$ awk -v b=2 '/\[/{c++} c==b; /]/ && c==b{exit}' ip.txt
[
eighth 
]
  • -v b=2どのブロックが必要かを指定する変数
  • /\[/{c++}行が開始条件と一致した場合のカウンタの増加
  • c==b;カウンタが必要なブロックと等しい場合は、入力レコードを印刷します。
  • /]/ && c==b{exit}終了条件が一致した場合

それを書くもう一つの方法:

awk -v b=2 '/\[/{c++} c==b{print $0; if(/]/) exit}' ip.txt

答え2

$ sed -n '/^\[/h; /^\[/,/^\]/H; ${x;s/^\[\n//;p;}' file
[
eighth
]

注釈付きsedスクリプト(仮説-n):

/^\[/h;         # replace hold space with this line
/^\[/,/^\]/H;   # append these lines to hold space with embedded newlines
${              # at last line of input
    x;          # swap in the hold space
    s/^\[\n//;  # delete the first "[" and the newline following it
    p;          # print
}

つまり、で始まる行が見つかるたびに、その行を[コピーして予約済みスペースを消去します。次に、で始まる行が見つかるまで、予約済みスペースに行を追加し続けます]

最後に、[予約済みスペースが多すぎるため、データを印刷する前にそのスペース(およびその後に含まれる改行文字)を削除してください。

答え3

sedエディタを使用して、次のことができます。

sed -ne '                    ;# "-n" suppresses autoprint of pattern space
    /^\[/!d                  ;# skip lines that donot begin a fresh block
    :a;$!N;/\n]/!ba          ;# keep appending lines to pattern space until end of block
    G                        ;# append our makeshift counter (hold space) to pattern spc
    s/\n\{2\}$//p            ;# only when counter had 2 chars in it, we print block
    /\n$/!q                  ;# target block, 2nd block has been printed so quit 
    x;s/$/\n/;x              ;# target block not reached, so increment
' input.file

の場合、ブール値$ k == 2でこの演算子を使用Perlして...、期待されるターゲットブロックに到達し、それを印刷する必要があることを示します。

perl -lne 'print if /^\[/ && ++$k == 2 ... /^]/' input.file    

答え4

nl -bp'\[' -s ' ' input.txt | sed -n '/ *2 \[/,/\]/p' | cut -c 8-

入力.txt:

first
[
third
fourth
]
sixth
[
eighth 
]
tenth

標準出力:

[
eighth 
]

説明する

  1. nl -bp特定のパターンに従って行番号を追加できます。
  2. ここでは、タブのnl -s ' '代わりにスペースを区切り文字として使用します。\tsed
nl -bp'\[' -s ' ' input.txt
       first
     1 [
       third
       fourth
       ]
       sixth
     2 [
       eighth 
       ]
       tenth
  1. デフォルトでは、nlパディングの前に6文字が追加され、最初の7文字を削除できますcut -c 8-

関連情報