awk 仅删除数字字段

awk 仅删除数字字段

当我使用这个命令时:

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

也有效。

相关内容