需要从该行中提取特定文本

时间:2016-03-21 11:47:16

标签: unix awk sed

我需要从下面提到的行中提取特定变量,我尝试使用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

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

3 个答案:

答案 0 :(得分:2)

你走了:

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

中断数据并全局申请。

答案 1 :(得分:1)

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

这将在两个单独的行中提取键和值,删除不需要的那个的print语句。

答案 2 :(得分:0)

.*正则表达式将始终尽可能匹配。如果那不是你想要的,那就少了。常见的规则是排除分隔符。

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

我们更换了正则表达式&#34;任何字符(换行符除外)&#34; .字符类与除(换行符)=,之外的任何字符匹配,从而约束*量词的范围。看到字段似乎总是包含数字数据,我们可以进一步限制它只匹配数字:[0-9]*

如果要执行多个替换,可以将它们合并到一个sed脚本中。

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

(并非所有sed方言都与多个-e选项一样。如果没有开箱即用,请参阅您的手册页。)