脚本删除字符串并保留文件中的数字

Kha*_*ela -1 bash awk sed

我的文件标题格式如下:

  • fileName01
  • file07
  • fileTitle8
  • fileName20

  • 字符串和数字之间没有分隔符,并且每行上的字符串字符不相等.

  • 我想只输出文件名末尾的数字:

  • 01
  • 07
  • 8
  • 20

P.P*_*.P. 6

使用tr:

cat filename | tr -d [:alpha:]
Run Code Online (Sandbox Code Playgroud)

  • 总是有一个较短的代码:)`tr -d [:alpha:] <filename (3认同)

new*_*rey 6

如果您想要数字并且可能存在非字母数字字符,则可以使用sed[^0-9]:

cat filename | sed 's|[^0-9]||g'
Run Code Online (Sandbox Code Playgroud)

此外,如果存在重复的可能性和顺序是不是一个问题,你可以用这个组合sortuniq:

cat filename | sed 's|[^0-9]||g' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

最后一个示例将为您提供文件中找到的不同数字列表; 但是,它确实尊重领先0(即 - 8!= 08).

更新(仅限bash):

while read line; do \
    echo ${line//[^0-9]/}; \
done < filename
Run Code Online (Sandbox Code Playgroud)

虽然可读性较差(从我的观点来看),但它是一个可行的替代方案,可以实现相同的目标.此外,追加|sort | uniq仍然适用于此示例.

编辑(文件扩展名)
为了保持文件扩展名(或第一个数字实例之后的任何文本),根据OP的注释,gsed命令中删除并添加一个*将处理这个:

cat filename | sed 's|[^0-9]*||'
Run Code Online (Sandbox Code Playgroud)

这将在第一个数字实例之后保留所有内容,因此filename123.mp3变为123.mp3,并且file123part456.txt变为123part456.txt.

如果你需要一个非常敏感的比赛专门让只有最后一个数字和任何现有的文件扩展名(不带文件扩展名的可能性,因为原来的问题表明的例子),你可以使用grep-P-o标志:

grep -Po "[0-9]*(\..*)?" filename
Run Code Online (Sandbox Code Playgroud)

这将导致filename123.mp3返回123.mp3,并file123part456.txt返回456.txt.该-P标志表示将模式解释为Perl正则表达式; 该-o指示只返回线相匹配的部分-不相匹配的全系列.