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