linux - 如何在 Shell 脚本中仅从变量返回整数并丢弃字母和前导零?

标签 linux shell

在我的 shell 脚本中,有一个来自某些系统的参数,它给出的答案与此类似:PAR0000008。 我只需将该参数的最后一个数字发送到另一个变量,即 VAR=8。 我使用了命令 VAR=$( echo ${PAR} | cut -c 10 ) 并且它运行得很好。 问题是当 PAR 参数返回两位小数的数字(如 PAR0000012)时。我需要丢弃前导零并仅将数字 12 发送到变量,但我不知道如何在 Shell 中执行逻辑来丢弃数字左侧的所有字符。

最佳答案

使用 grep 进行编辑以将 0 作为最终数字的一部分处理

由于您使用的是 POSIX shell,因此使用 sedgrep(或 cut)等实用程序是有意义的。 grep 在解析字符串方面更加灵活,允许 REGEX 匹配来处理这项工作。假设您的变量 v=PAR0312012 并且您想要结果 r=312012。您可以使用命令替换(例如$(...))来解析将结果分配给r的值,例如

v=PAR0312012
r=$(echo $v | grep -Eo '[1-9].*$')
echo $r

grep 表达式是:

  • -Eo - 使用扩展 REGEX 并且仅返回字符串的匹配部分,
  • [1-9].*$ - 从 [1-9] 中的第一个字符开始返回字符串的其余部分。

这适用于 PAR0000012PAR0312012(结果为 312012)。

结果

对于PAR0312012

312012

使用expr的另一个解决方案

如果您的变量可以包含零作为最终数字部分的一部分,那么您必须找到第一个 [1-9] 字符出现的索引,然后分配从该索引开始的子字符串到你的结果变量。

POSIX shell 提供了expr,它提供了一组可以实现此目的的字符串解析工具。所需的命令是:

expr index string charlist

expr substr string start end

其中 startend 是要从字符串中提取的开始索引和结束索引。 end 的长度必须足以包含整个子字符串,因此您可以只使用字符串的总长度,例如

v=PAR0312012
ndx=$(expr index "$v" "123456789")
r=$(expr substr "$v" "$ndx" 10)
echo $r

结果

312012

这将在第一个 [1-9] 之后的任何位置处理 0

(注意:旧的 expr ... 并不是处理此问题的最快方法,但如果您只关心几万个值,它会工作得很好。可能需要十亿个数字和另一种方法)

关于linux - 如何在 Shell 脚本中仅从变量返回整数并丢弃字母和前导零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69668136/

相关文章:

linux - 如何在 Ubuntu 中为 Qt 5.11.2 添加 mysql 驱动程序

linux - 如何在 jar 中查找文件而不解压它并从命令行在编辑器中打开?

bash - 带有空格的 Mac OS shell 脚本 cd 文件夹不起作用

excel - 执行 AutoIt 并等待完成

linux - 如何使用克隆系统调用分配新的 TLS 区域

linux - 使用 Supervisor 在监督下运行流程

java - 在舞台中替换场景后如何获取场景的正确位置?

linux - grep:如何将匹配捕获到变量中?

bash - 在容器内运行 shell 脚本

node.js - 端口 80 上的 linux systemd 服务