我的文件标题格式如下:
fileName20
字符串和数字之间没有分隔符,并且每行的字符串字符不相等。
我想只输出文件名末尾的数字:
答案 0 :(得分:6)
使用tr:
cat filename | tr -d [:alpha:]
答案 1 :(得分:6)
如果您特别希望仅这些数字并且可能存在非字母数字字符,则可以使用sed
和[^0-9]
:
cat filename | sed 's|[^0-9]||g'
此外,如果存在重复的可能性且订单不是问题,您可以将其与sort
和uniq
结合使用:
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.mp3
,123.mp3
变为file123part456.txt
。
如果您需要一个非常敏感的匹配,专门获取仅最后一个数字和任何现有的文件扩展名(可能没有文件扩展名,原始问题显示示例),可以将123part456.txt
与grep
和-P
标记一起使用:
-o
这会导致grep -Po "[0-9]*(\..*)?" filename
返回filename123.mp3
,123.mp3
返回file123part456.txt
。 456.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]会删除除了遍历列表的每个字符串中的数字之外的所有内容。