正则表达式匹配线除了具有特殊字符的单词

时间:2017-01-28 04:52:38

标签: regex

我正在尝试从apt-cache depends输出获取包依赖项,并尝试删除“取决于:”,“推荐:”,“建议:”。

$ apt-cache depends gdebi
gdebi
  Depends: <python3:any>
    python3:i386
    python3
  Depends: gdebi-core
  Depends: gir1.2-gtk-3.0
  Depends: gir1.2-vte-2.91
  Depends: python3-gi
  Depends: gksu
  Depends: gnome-icon-theme
  Recommends: libgtk2-perl
  Recommends: shared-mime-info
    shared-mime-info:i386
  Recommends: lintian

我尝试过使用这种模式,但只能删除没有冒号的单词“:”

  

(?!取决于:\ b)\ b。+

我错过了什么?我如何仅使用grep -P获取它?

输出应该是这样的。

<python3:any>
python3:i386
python3
gdebi-core
gir1.2-gtk-3.0
gir1.2-vte-2.91
python3-gi
gksu
gnome-icon-theme
libgtk2-perl
shared-mime-info
shared-mime-info:i386
lintian

2 个答案:

答案 0 :(得分:0)

你的“仅限grep”要求是奇怪而且弄巧成拙,但是因为你坚持认为:如果我们可以假设包的名称中没有任何空格,那么这样做:

apt-cache depends gdebi | head -n +2 | grep -o '\S\+$'

-o标志使grep仅打印匹配行的部分。

Try it online!

原始答案

对于标准的unix工具sed来说,这是一项很好的任务:

apt-cache depends gdebi | sed -re '1d; s/^ +((Depends|Recommends|Suggests): )?//'

sed代码有两部分:

  1. 1d删除第一行。
  2. s/^ +((Depends|Recommends|Suggests): )?//将前两个斜杠之间与正则表达式匹配的任何文本替换为最后两个斜杠之间的文本(在本例中为空字符串)。
  3. -r标志告诉sed我们正在使用extended regular expressions,这意味着我们不必转义特殊字符(在这种情况下,()+?),反斜杠。

    Try it online!

答案 1 :(得分:0)

您可以将此正则表达式用于多行标记:

查找

^(\s*((Suggests)|(Recommends)|(Depends)):)?\s*(.*)$

替换:

$2

演示:

https://regex101.com/r/CuaosB/3

正则表达式:

^(\s*(?:(?:Suggests)|(?:Recommends)|(?:Depends)):)?查看此模式的行首0或1次,并作为第1组捕获

\s*在第一个模式之后消耗空格。

(.*)$选择第一个模式之后的所有内容,直到行结束并捕获为第2组。