2012-08-11 59 views
1

好吧,這裏有一個棘手的問題......我有一個file1,我想用file1中的特定文本創建file2。使用bash在文本文件中提取4個標記之間的文本

 random useless text 
    #START 
    random IMPORTANT text 
    #END 
    random useless text 

    random useless text 
    #START 
    random IMPORTANT text 
    #END 
    random useless text 

我想提取在所述第一對和#START的#END(包括#的)之間的文本,但忽略第二對#START和#END的。請注意,#START #END對在同一個文件中出現兩次。我只想要第一對(包括#的符號)之間的內容。

這一切都說過和做過之後,我只有這個文字結果(從第一隻對#START #END的:

 #START 
    random IMPORTANT text 
    #END 

在另一個崗位有人使用:

sed -n「/這是標記1 /,/這是標記2/p」

這是一種刪除單個配對字符串「這是一個標記1」和「這是一個標記2」

但是,當我在此sed中使用「#START」和「#END」時,它會保留#START和#END這兩對。

注意:第一個#START #END之間的內容總是與第二對#START #END之間的內容不同。

+0

什麼是令牌仍然打印?他們是如何分開的? – 2012-08-11 01:57:31

回答

5

我會用awk:

awk '/#START/{flag=1} flag{print} /#END/{exit}' your_file

說明:

  1. 在當前記錄包含開始標記的正則表達式匹配設置標誌。
  2. 當標誌被置位,當前記錄被印刷
  3. 當記錄匹配結束令牌,程序只是存在,從而第二拷貝不被處理

:多個AWK規則可應用於一記錄。 還要注意:這取決於你的任務,你可能需要調整記錄分隔RS和輸出記錄分隔ORS,例如:

gawk -v RS='[[:space:]]+' -v ORS=' ' '/#START/{flag=1} flag{print} /#END/{exit}'

這臺記錄分隔符來的空白字符的任意號碼,並輸出將分隔符記錄到空間。因此,令牌由空格隔開,並且不會有exta可能的信息進入輸出。比較,例如第一個版本VS這個版本上,例如輸入:

blahblahblah #START 
important text 
#END blah blah blah 
fdsfs 

gawk查閱官方參考手冊,如果需要的話:link

2

這可能會爲你工作(GNU SED):

sed '/#START/,/#END/!d;/#END/q' file 

說明:

  • /#START/,/#END/!d刪除(不要打印)任何不在#START#END之間的內容。這將只打印#START#END/#END/q之間
  • 退出,但是當你遇到#END
相關問題