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

Regex 如何使用sed*仅*返回**第n次出现的正则表达式匹配? 信息,regex,linux,bash,awk,sed,Regex,Linux,Bash,Awk,Sed,我有一个字符串,里面有时间信息。我只需要从这个字符串中获取月数。我正试图用sedsed来实现这一点,但我还没有太多的运气。我需要使用bash+命令行工具 当前尝试 返回1969 奖金 更一般地说,我的问题是字符串的整个“1969年12个月”部分。我用date获得时间差,但我必须考虑1970年的开始日期。我觉得很奇怪,我目前的产出将1970年表示为1969年12个月 编辑:我正试图使用纳克在这篇文章中的解决方案: 除了几个月之外,它对任何事情都有效。月数以(12个打印月数)为准。这是否适合: e

我有一个字符串,里面有时间信息。我只需要从这个字符串中获取月数。我正试图用sed
sed
来实现这一点,但我还没有太多的运气。我需要使用bash+命令行工具

当前尝试 返回
1969

奖金 更一般地说,我的问题是字符串的整个
“1969年12个月”
部分。我用
date
获得时间差,但我必须考虑1970年的开始日期。我觉得很奇怪,我目前的产出将1970年表示为1969年12个月

编辑:我正试图使用纳克在这篇文章中的解决方案:

除了几个月之外,它对任何事情都有效。月数以(12个打印月数)为准。

这是否适合:

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

这里发生的是:

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

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

这里发生的是:

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

我会像下面这样做:

str="1969 years 12 months 25 days 19 hours 38 minutes 24 seconds since last release"

read y m d H M S < <(echo $(grep -oP '\d+' <<<"$str"))
echo "month: $m"
echo "year: $y"
#etc for $d $H $M $S
  • grep
    过滤掉所有数字(每一行)
  • echo
    从数字中生成一个空格分隔的字符串
  • 什么将读取
    读取
    ,并将每个数字分配给相应的变量

我会像下面这样做:

str="1969 years 12 months 25 days 19 hours 38 minutes 24 seconds since last release"

read y m d H M S < <(echo $(grep -oP '\d+' <<<"$str"))
echo "month: $m"
echo "year: $y"
#etc for $d $H $M $S
  • grep
    过滤掉所有数字(每一行)
  • echo
    从数字中生成一个空格分隔的字符串
  • 什么将读取
    读取
    ,并将每个数字分配给相应的变量

听起来您好像在试图修复运行错误工具到不同日期的输出。只需使用GNU awk即可:

$ echo "2014-09-03T14:44:48+00:00" |
gawk '{gsub(/[-T:+]/," "); print (systime() - mktime($0)) / (24*60*60)}'
5.86991
对输出的天数进行任意四舍五入,例如:

$ echo "2014-09-03T14:44:48+00:00" |
gawk '{gsub(/[-T:+]/," "); printf "%.0f\n", (systime() - mktime($0)) / (24*60*60)}'
6

请注意,使用“%.0f”进行舍入的实现取决于系统-它可能向上舍入0.5,也可能向最近的偶数舍入。如果这是一个问题,请检查您的系统,并在必要时编写您自己的舍入函数。

听起来您试图修复运行错误工具到不同日期的输出。只需使用GNU awk即可:

$ echo "2014-09-03T14:44:48+00:00" |
gawk '{gsub(/[-T:+]/," "); print (systime() - mktime($0)) / (24*60*60)}'
5.86991
对输出的天数进行任意四舍五入,例如:

$ echo "2014-09-03T14:44:48+00:00" |
gawk '{gsub(/[-T:+]/," "); printf "%.0f\n", (systime() - mktime($0)) / (24*60*60)}'
6

请注意,使用“%.0f”进行舍入的实现取决于系统-它可能向上舍入0.5,也可能向最近的偶数舍入。如果这是一个问题,请检查您的系统,并在必要时编写自己的舍入函数。

您可以使用Perl来分离键、值对:

$ str="1969 years 12 months 25 days 19 hours 38 minutes 24 seconds since last release"
$ echo $str | perl -lane 'print "$1 $2"  while /(\d+)\s(\w+)/g'
1969 years
12 months
25 days
19 hours
38 minutes
24 seconds
然后使用grep抓取您想要的:

$ echo $str | perl -lane 'print "$1 $2"  while /(\d+)\s(\w+)/g' | grep 'months'
12 months

您可以使用Perl来分离键、值对:

$ str="1969 years 12 months 25 days 19 hours 38 minutes 24 seconds since last release"
$ echo $str | perl -lane 'print "$1 $2"  while /(\d+)\s(\w+)/g'
1969 years
12 months
25 days
19 hours
38 minutes
24 seconds
然后使用grep抓取您想要的:

$ echo $str | perl -lane 'print "$1 $2"  while /(\d+)\s(\w+)/g' | grep 'months'
12 months

为什么不使用
grep-Po'(?如果你不给我们原始输入并告诉我们你正在做什么来处理它们,我们就无法解决奖金问题。@EtanReisner,我更新了我的帖子,提供了关于更大问题的更多细节。什么日期让你得到了输出?输入示例:
2014-09-03T14:44:48+00:00
和当前日期。你为什么不使用
grep-Po'(?如果你不给我们原始输入并告诉我们你正在做什么来处理它们,我们就无法解决奖金问题。@EtanReisner,我更新了我的帖子,提供了关于更大问题的详细信息。什么日期让你得到了输出?输入示例:
2014-09-03T14:44:48+00:00
和当前日期。