cod*_*ers 2 bash sed awk shell-script
我正在尝试输入一些只会返回由空行分隔的第一个“段落”或“部分”的内容。我以为我可以根据其他一些答案使用awk
或sed
获得一个范围,但它似乎不起作用。
$ 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 相同的结果。
在第一次发生后如何获得awk
或sed
停止?
这正是 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==1
to的明显变化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 代替,这使您可以更好地控制何时/如何打印开始/结束行等。