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)