如何在变量或字符串上使用 grep?

如何在变量或字符串上使用 grep?

我正在编写一个 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

要将命令的输出分配给变量,请使用$()

revNumber=$(echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+")

如果你只关心匹配,你可能需要考虑case

case foo in
  f*) echo starts with f
   ;;
  *) echo does not start with f
   ;;
esac

答案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

相关内容