我有這個簡單的平台檔案(file.txt)
a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo
我需要 test1 和 test2 之間的所有行以兩種形式,第一個建立兩個新文件,例如
新文件1.txt:
test1
abc
cvb
bnm
test2
新文件2.txt
test1
def
ijk
xyz
test2
第二種形式僅建立一個新文件,例如:
新文件.txt
test1abccvbbnmtest2
test1abccvbbnmtest2
你有什麼建議嗎?
對於第二種形式。我用過這個
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
找到,則增加文件編號並開始輸出(即轉on
) - 如果打開,則列印行到檔案名稱“newfileFILE.txt”,其中 FILE 是檔案號碼。
- 如果
test2
找到,則結束輸出(即關閉)
newfile.txt
然後,您可以使用 shell oneliner將這兩個檔案轉換為:
for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt
這表示,對於每個文件,刪除所有換行符。
答案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]*//' --> 刪除每行開頭的空格。