我需要从下面提到的行中提取特定变量,我尝试使用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
请帮助我理解或者是否有任何最佳命令可以帮助我。
答案 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
选项一样。如果没有开箱即用,请参阅您的手册页。)