簡體   English   中英

如何選擇標記之間的多行(*),但最后一行除外(使用sed)? 而我該如何選擇其余的呢?

[英]How do i select multiple lines between markers (*) excluding the last one (using sed)? And how do I select all the rest?

我有一個巨大的.txt文件,其格式如下(每行非空白行均以三倍空白開頭):

   unwanted text
   unwanted text

   *wanted text
   abc
   def

   *wanted text 2
   content
   content

   *wanted text 3
   content
   content

   (...)

我正在尋找一個代碼,該代碼僅向我返回從第一個“ *”出現到(但不包括)第二個“ *”出現的行。

瀏覽多個StackOverflow帖子,我已經使用Ubuntu(GNU / Linux)設法獲得了以下工作代碼:

sed -n -e '/^   \*/{p;q}' bigfile.txt && sed -e '1,/   \*/d' -e '/   \*/,$d' bigfile.txt

它給了我以下(根據需要)輸出:

*wanted text
abc
def
\n (representing a wanted blank line)

盡管這正是我想要的輸出,但您必須同意我的意見,這是一種愚蠢的代碼,因為我必須兩次使用sed。 首先,我只有它的第二部分(在“ &&”之后),並且將返回除第一行(*所需文本)之外的其他內容。 然后,我在代碼的第一部分(“ &&”之前)附加了,因此我也得到了所需部分的第一行。 我嘗試過的所有其他代碼都沒有給我帶來更好的結果。

永遠不要說這是一個很大的文件,我將在腳本中遞歸執行此操作,因此,如果可能的話,最好使用/ q(在找到第一個結果后退出)。

完成此操作后,我需要將最后一條命令的結果作為輸入的內容,因此除先前的結果外,我可以獲得確切的整個文本,例如:

   unwanted text
   unwanted text

   *wanted text 2
   content
   content

   *wanted text 3
   content
   content

   (...)

因此,總而言之,我的兩個問題是:

  • 有沒有一種方法可以使用sed單線獲得如上所述的第一期望輸出,而無需調用sed兩次(最好在找到摘錄后退出,這樣它就不會搜索所有大文件)? 我敢肯定,有一個更優雅的解決方案。
  • 如何獲得“除上一個問題的結果以外的所有文本”作為輸出(如“反向”輸出?)? 我沒有軟件要求,我只需要它,這樣我就可以一次又一次地運行先前的操作並“不斷更新”輸入,並根據特定條件處理第一個命令的每個輸出。

希望我足夠清楚。 請問我是否缺少任何細節。 非常感謝您的關注!

awk解救!

$ awk '$1~/^*/{if(f) exit; f=1} f' file

   *wanted text
   abc
   def
   <-- here is the empty line formatter eats

第二部分

$ awk '$1~/^*/{f++} !f||f>1' file

   unwanted text
   unwanted text

   *wanted text 2
   content
   content

   *wanted text 3
   content
   content

   (...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM