【问题标题】:need to extract specific text from the line需要从行中提取特定文本
【发布时间】:2016-03-21 21:31:54
【问题描述】:

我需要从下面提到的行中提取特定变量,我尝试使用 sed 提取变量,但我不确定缺少 ing_month 变量的原因。

Script:

 echo "ing_year=2016,ing_month=03,ing_day=11" | sed 's/=.*,/,/g' | sed 's/=.*//g'

需要输出:

ing_year,ing_month,ing_day

请帮助我理解,或者是否有任何最佳命令可以帮助我。

【问题讨论】:

    标签: unix awk sed


    【解决方案1】:

    给你:

    $ echo "ing_year=2016,ing_month=03,ing_day=11" | sed -r 's/([^=]+)=([^,]*)/\1/g'
    ing_year,ing_month,ing_day
    

    打破数据并在全球范围内应用。

    【讨论】:

    • 起初我很困惑,认为 OP 想要每个变量的值,但从它的编写方式看来,他/她想要的是变量名。我使用的是 Windows 7,但我在 git 环境中的 bash shell 中输入了您的第一行。它给出了与您相同的结果行。这就是 OP 所说的他/她想要的。 QED(给你一点。)
    【解决方案2】:

    .* 正则表达式将始终尽可能匹配。如果那不是您想要的,请减少匹配。一个常见的安排是排除分隔符。

    sed 's/=[^=,]*//g' <<<'ing_year=2016,ing_month=03,ing_day=11'
    

    我们将正则表达式“任何字符(换行符除外)”. 替换为匹配除(换行符或)=, 之外的任何字符的字符类,从而限制了* 量词的范围。由于字段似乎总是包含数字数据,我们可以进一步限制它只匹配数字:[0-9]*

    如果您想执行多个替换,可以将它们组合在一个 sed 脚本中。

    sed -e 's/a/b/' -e 's/c/d/'
    

    (并非所有sed 方言都像多个-e 选项一样。如果这不能开箱即用,请参阅您的手册页了解详细信息。)

    【讨论】:

      【解决方案3】:

      awk 来救援!

      $ echo "ing_year=2016,ing_month=03,ing_day=11" | 
        awk -F'[=,]' -v OFS=, '{print $1,$3,$5; print $2,$4,$6}'
      
      ing_year,ing_month,ing_day
      2016,03,11
      

      这会在两个单独的行中提取键和值,删除不需要的打印语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多