regex - 如何使用 sed *返回* *仅*第 n 次出现的正则表达式匹配?

标签 regex linux bash awk sed

信息

我有一个包含时间信息的字符串。我只需要从该字符串中获取月数。我正在尝试使用 sed 来完成此操作,但我还没有太多运气。使用 bash + 命令行工具是我的要求。

当前尝试

echo "1969 years 12 months 25 days 19 hours 38 minutes 24 seconds since last release" | sed -r "s/^([0-9]+).*/\1/"

返回 1969

奖金

更一般地说,我的问题是字符串的整个 "1969 years 12 months" 部分。我正在使用 date 来获取时差,但我必须考虑 1970 年的开始日期。我发现我当前的输出将 1970 表示为 1969 年零 12 个月 很奇怪。

编辑:我正在尝试使用这篇文章中的 nunk 解决方案:

How to find the difference in days between two dates?

除月份外,它适用于所有内容。月数差了(12印月数)。

最佳答案

这件衣服是否适合:

echo "1969 years 12 months 25 days 19 hours 38 minutes 24 seconds since last release" | sed -r 's/.* ([0-9]+) months.*/\1/'

给予

12

这里发生的事情是这样的:

  • 如果按顺序满足以下所有条件,则表达式的“匹配”部分将成功:
    • .* 任何东西
    • 一个空格
    • [0-9]+一个或多个数字(使用()“捕获”)
    • 另一个空间
    • months “月”这个词
    • .* 任何东西
  • 如果成功,则保证匹配整行,因为两端都有 .*
  • 此外,如果成功,匹配项(整行)将被 \1 替换,这是一个特殊代码,意思是“第一组捕获括号的内容。你会看到上面括号中的值是单词“月”之前的数字。

关于regex - 如何使用 sed *返回* *仅*第 n 次出现的正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25748624/

相关文章:

linux - 无限循环内的 select() 在 RHEL 4.8 虚拟机上使用的 CPU 明显多于在 Solaris 10 计算机上

linux - Shell 脚本大小写语法错误

linux - Bash:想要将一定数量的包含空格的文件移动到不同的目录

linux - 等待特定 pid 的最佳方法

linux - 使用 scp 从远程服务器下载文件。但是返回错误

python - 将文本拆分到关联表时无法显示文本列

php - "~"字符在 PHP 正则表达式中表示什么?

regex - Perl 中的相等字符串不相等

java - 正则表达式 [a-zA-Z]{0,2}

linux - 在 vagrant 上排序需要 2 小时 - 大约 100m 行