awk 从固定文本开始,直到第一个空行

cod*_*ers 2 bash sed awk shell-script

我正在尝试输入一些只会返回由空行分隔的第一个“段落”或“部分”的内容。我以为我可以根据其他一些答案使用awksed获得一个范围,但它似乎不起作用。

$ cat txt
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

$ cat txt |awk '/^Package:/,/^$/'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y
Run Code Online (Sandbox Code Playgroud)

它不应该只返回第一个“部分”吗?(按照: Grep 从固定文本开始,直到第一个空行https://www.unix.com/shell-programming-and-scripting/148692-awk-script-match-pattern-till-blank-line .html )

  • 如果我使用grep -ve ^$空行被删除,那么就没有特殊字符。
  • 如果我尝试提取不同的部分,我会从两个“部分”中获取部分:

    $ cat txt |awk '/^Package:/,/^Version:/'
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.9.1-0ubuntu0.1
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.4-0ubuntu1
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果我使用sed -n '/^Package:/,/^$/p'sed -n '/^Package:/,/^Version:/p'我得到与等效 awk 相同的结果。

在第一次发生后如何获得awksed停止?

Ed *_*ton 8

这正是 awk 具有段落模式的原因:

$ awk -v RS= 'NR==1' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y
Run Code Online (Sandbox Code Playgroud)

并打印第二条记录只是NR==1to的明显变化NR==2

$ awk -v RS= 'NR==2' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y
Run Code Online (Sandbox Code Playgroud)

永远不要使用范围表达式 btw - 它们使处理琐碎问题的代码比使用标志更简短,但是如果您的需求有丝毫变化,则需要完全重写或重复条件。因此,任何时候您可能想要使用/begin/,/end/sed 或 awk 使用/begin/{f=1} f{print} /end/{f=0}awk 代替,这使您可以更好地控制何时/如何打印开始/结束行等。