grep 在具有指定字串的兩行之間

grep 在具有指定字串的兩行之間

我有這個簡單的平台檔案(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]*//' --> 刪除每行開頭的空格。

相關內容