この単純なプラットフォームファイル(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
ファイル番号を増やして出力を開始します(例:transferon
)。 - オンの場合、ファイル名 "newfileFILE.txt" に行を印刷します。ここで、FILE はファイル番号です。
- 見つかったら、
test2
出力を終了します(例:閉じる)。
newfile.txt
その後、Shell Onelinerを使用してこれら2つのファイルを次のファイルに変換できます。
for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt
これは、各ファイルに対してすべての改行が削除されることを意味します。
答え2
2番目のフォームの場合:
sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
- sed -n '/test1/,/test2/p' file.txt --> test1 と test2 の間のテキストキャプチャ
- xargs> newfile.txt --> xargsの目的は異なるかもしれませんが、実際にテキストを「行」に変換します。
- sed 's/test2/&\n/g' newfile.txt --> "test2" パターンの後に改行を追加する
- sed -e 's/^[ \t]*//' --> 各行の先頭から空白を削除します。