有没有办法在不重复代码的情况下过滤和打印特定模式?

Joh*_*ers 3 grep sed text-processing

如果我pacman用来安装软件,我偶尔会遇到表单的错误

package-name: /some/package/file exists in filesystem
Run Code Online (Sandbox Code Playgroud)

如果我在过去的某个时间搞砸了安装,不明智地尝试手动安装某些东西等等,通常会发生这种情况。

为了解决这个问题,将所有冲突包的名称放在一个文件中很有用。我可以使用

# pacman -S package-name |
   grep '^package-name: [^ ]* exists in filesystem$' |
   sed 's/^package-name: \([^ ]*\) exists in filesystem$/\1/' >
   conflicting_files.txt
Run Code Online (Sandbox Code Playgroud)

但是,这需要我输入两次相同的内容。有没有办法在不复制正则表达式的情况下做同样的事情?

ter*_*don 11

很多方法。例如,sed单独使用(我在这里假设 GNU 工具,因为您正在使用pacman):

pacman -S package-name |
   sed -En 's/^package-name: ([^ ]*) exists in filesystem$/\1/p' >
   conflicting_files.txt
Run Code Online (Sandbox Code Playgroud)

或者grep

pacman -S package-name |
   grep -oP '^package-name: \K\S+' >
   conflicting_files.txt
Run Code Online (Sandbox Code Playgroud)

如果您需要匹配行尾,请使用@RomanPerekhrest 的建议

或者perl

pacman -S package-name |
   perl -ne 's/^package-name: (\S*) exists in filesystem$/$1/ && print' >
   conflicting_files.txt
Run Code Online (Sandbox Code Playgroud)

或者perl

pacman -S package-name |
    perl -lane 'print $F[1] if /^package-name:.*exists in filesystem$/' >
    conflicting_files.txt
Run Code Online (Sandbox Code Playgroud)

或者awk

pacman -S package-name |
    awk '/^package-name:.*exists in filesystem$/{print $2}' > 
    conflicting_files.txt
Run Code Online (Sandbox Code Playgroud)