テキストファイルの検索パターン間のすべての行を別のファイルとして印刷する

テキストファイルの検索パターン間のすべての行を別のファイルとして印刷する

以下を含むファイルがありますtest.txt

....Request....
asaksa
sda
dsad
dsad
....Request...
21mklk
nnm212
mkmr543
849238
....Request...
4392840
kndska
94i0-jkfjdk
smdla
.....Request..
839281
ksndlka
nsc
mcxmzl

2つの「要求」パターン間のすべての行を異なる-2ファイルに印刷したいと思います。たとえば、次のようになります。

ファイル1:

asaksa
sda
dsad
dsad

ファイル2:

21mklk
nnm212
mkmr543
849238

ファイル3:

4392840
kndska
94i0-jkfjdk
smdla

ファイル4:

839281
ksndlka
nsc
mcxmzl

同様に

答え1

文字列が見つかるたびにRequestファイルカウンタを増やすのはどうですか?

awk '/Request/ {n++; next}; {print > "file"n}' test.txt

答え2

csplit -f file -z --suppress-matched - '/Request/' '{*}' <<\DATA
....Request....
asaksa
sda
dsad
dsad
....Request...
21mklk
nnm212
mkmr543
849238
....Request...
4392840
kndska
94i0-jkfjdk
smdla
.....Request..
839281
ksndlka
nsc
mcxmzl
DATA

基本的にどのように使用するか尋ねますcsplit。その使命は、コンテキストマッチングに従って入力ファイルを別々のファイルに分割することです。

ls 

file00  file01  file02  file03

cat file00

asaksa
sda
dsad
dsad

cat file*

asaksa
sda
dsad
dsad
21mklk
nnm212
mkmr543
849238
4392840
kndska
94i0-jkfjdk
smdla
839281
ksndlka
nsc
mcxmzl

答え3

NRまたは、レコード番号に組み込み変数を使用してください。

awk -v RS='\\.+Request\\.+'  '{if (NR==1) next}  {print > "file"NR-1 }' test.txt

そしてfile1

わずかに長いこのファイルは、各出力ファイルの先頭と末尾から空白行を削除します。

awk -v RS='\\.+Request\\.+' -v ORS= '{if (NR==1) next}  { gsub("^\n",""); print > "file"NR-1 }' test.txt

関連情報