当我使用这个命令时:
ls /var/log/packages/*SBo|cut -d / -f 5
它返回这个:
webcore-fonts-3.0-noarch-3_SBo
winetricks-20120923-noarch-1_SBo
wireshark-1.12.1-x86_64-1_SBo
wxGTK-2.8.12-x86_64-3_SBo
我想删除从数字字段开始的所有内容(应省略其余行)。所以我希望它看起来像:
webcore-fonts
winetricks
wireshark
wxGTK
这个怎么做?我认为awk
这是完美的,但我不知道如何删除其余的行(但仅限于数字)。
答案1
你可以试试 :
ls /var/log/packages/*SBo| sed 's/-[0-9].*//'
答案2
这很容易通过以下方式完成sed
:
$ ls /var/log/packages/*SBo | sed -r 's|.*/||; s/-[[:digit:]][[:digit:].]*-.*//'
webcore-fonts
winetricks
wireshark
wxGTK
解释:
-r
这可以实现扩展的正则表达式,从而减少所需的转义次数。
s|.*/||
这将删除文件名之前的目录。
s/-[[:digit:]][[:digit:].]*-.*//
这看起来是一个被破折号包围的数字,并将其删除以及后面的所有内容。正则表达式使用
[:digit:]
而不是[0-9]
确保它适用于所有语言环境和扩展字符集。
在 Mac OSX 上,尝试:
ls /var/log/packages/*SBo | sed -E -e 's|.*/||' -e 's/-[[:digit:]][[:digit:].]*-.*//'
答案3
如果您的文件名称中可以包含空格等奇特字符,或者您不喜欢解析命令的想法ls
,那么您可以使用find
:
find /var/log/packages -maxdepth 1 -name '*SBo' -exec sh -c 'sed s,.*/,,\;s/-[[:digit:]].*//<<<"$0"' {} \;
答案4
您可以在类似 Bourne 的 shell 中这样做:
for Package in /var/log/packages/*SBo;do
Package="$(basename $Package)"
echo "${Package%%-[0-9]*}"
done
这利用了参数扩展从包的名称中删除第一次出现后的任何内容,-
后跟一个数字,后跟任何其他内容。
如果您的区域设置有未捕获的数字[0-9]
,[[:digit:]]
则使用的技巧约翰1024的回答也在这里工作。那是,
for Package in /var/log/packages/*SBo;do
Package="$(basename $Package)"
echo "${Package%%-[[:digit:]]*}"
done
也有效。