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

时间:2012-09-12 21:53:38

标签: bash sed awk

我的文件标题格式如下:

  • fileName01
  • file07
  • fileTitle8
  • fileName20

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

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

  • 01
  • 07
  • 8
  • 20

6 个答案:

答案 0 :(得分:6)

使用tr:

cat filename | tr -d [:alpha:]

答案 1 :(得分:6)

如果您特别希望这些数字并且可能存在非字母数字字符,则可以使用sed[^0-9]

cat filename | sed 's|[^0-9]||g'

此外,如果存在重复的可能性且订单不是问题,您可以将其与sortuniq结合使用:

cat filename | sed 's|[^0-9]||g' | sort | uniq

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

更新(仅限bash):

while read line; do \
    echo ${line//[^0-9]/}; \
done < filename

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

编辑(文件扩展名)
要保留文件扩展名(或第一个数字实例后的任何文本),请根据OP的注释,从g命令中删除sed并添加{ {1}}将处理此问题:

*

这将保留第一个数字实例之后的所有内容,因此cat filename | sed 's|[^0-9]*||' 变为filename123.mp3123.mp3变为file123part456.txt

如果您需要一个非常敏感的匹配,专门获取最后一个数字和任何现有的文件扩展名(可能没有文件扩展名,原始问题显示示例),可以将123part456.txtgrep-P标记一起使用:

-o

这会导致grep -Po "[0-9]*(\..*)?" filename 返回filename123.mp3123.mp3返回file123part456.txt456.txt标志表示将模式解释为Perl正则表达式; -P表示仅返回行的匹配部分 - 而不是匹配的整行。

答案 2 :(得分:2)

我会将grep -o用于OP发布的问题:

grep -o '[0-9]*' filenames

修改

在评论中OP询问如何删除主要文本,在这种情况下使用:

sed 's/[^0-9]*//' filename

答案 3 :(得分:1)

假设ASCII字符串

echo“HelloTrailz23”| tr -d'[A-Z] [a-z]'

如果您正在处理unicode文件名,则所有投注均已关闭。

答案 4 :(得分:1)

这可能适合你(GNU sed):

echo filename123onetwothree.999 | sed 's/.*[^0-9]\([0-9]*\)$/\1/'
999

这只提取文件名的 end 中的数字。

使其普遍使用:

sed 's/.*[^[:digit:]]\([[:digit:]]*\)$/\1/' file

答案 5 :(得分:0)

我总是喜欢使用bash的变量字符串操作。这太过分了,但它很快就可以在命令行上运行。

- url: /.*
  script: my.application
  secure: always

结果:

for i in fileName01 file07 fileTitle8 fileName20 file123._mp3 ; do echo ${i//[!0-9]} ; done

$ {i}变量中的// [!0-9]会删除除了遍历列表的每个字符串中的数字之外的所有内容。