指定された文字列を持つ2行間のgrep

指定された文字列を持つ2行間のgrep

この単純なプラットフォームファイル(file.txt)があります。

a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo

2 つの形式の test1 と test2 の間のすべての行が必要です。最初の行は2つの新しいファイルを作成します。

新しいファイル 1.txt:

test1
abc
cvb
bnm
test2

新しいファイル2.txt

test1
def
ijk
xyz
test2

2番目のフォームは単に新しいファイルを生成します。たとえば、次のようになります。

新しいファイル.txt

test1abccvbbnmtest2
test1abccvbbnmtest2

おすすめメニューとは何ですか?

2番目の形式の場合。私はこれを使用しました

sed -n '/test1/,/test2/p' file.txt > newfile.txt

しかし、それは私にこのような結果を与える

test1abccvbbnmtest2test1abccvbbnmtest2

次の戻り行が必要です。

test1abccvbbnmtest2
test1abccvbbnmtest2

ベストアンサー1

最初のケースのawk oneliner:

awk '/^test1/{file++; on=1} on{print >("newfile" file ".txt")} /^test2/{on=0}' file.txt

これは次のように言います。

  • 見つかったら、test1ファイル番号を増やして出力を開始します(例:transfer on)。
  • オンの場合、ファイル名 "newfileFILE.txt" に行を印刷します。ここで、FILE はファイル番号です。
  • 見つかったら、test2出力を終了します(例:閉じる)。

newfile.txtその後、Shell Onelinerを使用してこれら2つのファイルを次のファイルに変換できます。

for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt

これは、各ファイルに対してすべての改行が削除されることを意味します。

おすすめ記事