我正在编写一个 bash 脚本,我需要检查文件名末尾(句点后)是否有数字,如果有就获取它,但我不知道如何在变量或字符串上使用正则表达式。
我可以echo
在终端中使用管道将字符串导入 grep,如下所示:
echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"
但我需要将其输出分配给一个变量。我尝试这样做:
revNumber= echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"
但那不管用。我也尝试了许多其他方法,但都不起作用。
在我的 bash 脚本中,我想对变量而不是字符串使用 grep,但这里的概念是相同的。
如何在字符串或变量上使用 grep 然后将结果保存到另一个变量中?
答案1
答案2
为什么 grep 和 echo I/O 过度,我建议使用 bash 字符串处理功能:
TESTFNAME="filename.txt.283" # you can collect this from doing an ls in the target directory
# acquire last extension using a regexp, including the '.':
FEXT=$(expr "$TESTFNAME" : '.*\(\.[[:digit:]][[:digit:]]*\)')
# check if length is more than just the dot, that means we've got digits:
if [ ${#FEXT} -gt 1 ]; then
echo "Gotcha!" $testFilename ${#FEXT} $FEXT # do whatever you like with the file
fi
正则表达式可以优化并且并不完美,但基本内容如下:
- .* 开头将在文件末尾搜索。
- [[:digit::]] 几乎与 [0-9] 相同,但我发现它更具可读性
查看其他狂欢TLDP 的字符串操作功能这里。
答案3
下面是另一个选项,在提取字符串末尾的值之前使用 bash 正则表达式比较。
if [[ $TESTFNAME =~ \.[0-9]+$ ]]; then
VAL=$(egrep -o '[0-9]+$' <<<"$TESTFNAME")
fi