SED:一行中有多个图案并打印下一个单词

时间:2017-10-06 19:41:14

标签: regex sed

我有一个帖子的结果,我想用" mod ="打印所有出现的后面的单词。并且如果可能的话用a,

分隔它们

示例:

  

VAR1 = prueba1&安培; MOD = SgaCac&安培; MOD = SgaGenSgm&安培; ENV =安培; VAR2 = prueba2

应该打印

  

SgaCac,SgaGenSgm

我试过

echo "var1=prueba1&mod=SgaCac&mod=SgaGenSgm&env=&var2=prueba2" | sed 's/^.*mod=\([^&]*\).*/\1/'

但只打印一次

  

SgaGenSgm

6 个答案:

答案 0 :(得分:0)

GNU awk 解决方案:

s="var1=prueba1&mod=SgaCac&mod=SgaGenSgm&env=&var2=prueba2"
awk -v FPAT="mod=[^=&]+" '{ for(i=1;i<=NF;i++) printf "%s%s",substr($i,5),(i<NF)?",":ORS }' <<<"$s"

输出:

SgaCac,SgaGenSgm

答案 1 :(得分:0)

使用awk

$ s="var1=prueba1&mod=SgaCac&mod=SgaGenSgm&env=&var2=prueba2"

$ awk -F'=' -v RS='&' -v OFS=',' '/^mod/{v=(v ? v OFS:"")$2}END{print v}' <<<"$s"
SgaCac,SgaGenSgm

<强>解释

  • -F='='字段/列分隔符设置为=

  • -v RS='&'记录/行分隔符为&,因此它将覆盖默认行分隔符换行符char(\n),因此awk将解释{ {1}}作为行尾。

  • &输出字段分隔符为逗号

  • -v OFS=','如果行以正则表达式开头,则

  • /^mod/将变量v=(v ? v OFS:"")$2与现有内容(如果存在)连接,第二个字段(v),其中分隔符为逗号,其他只是第二个字段

  • 最后打印变量$2内容
  • END{print v}

答案 2 :(得分:0)

sed -E 's/.*&mod=([^&]*)&mod=([^&]*).*/\1,\2/'

使用awk

awk -F"=|&" '{print $4","$6}'

答案 3 :(得分:0)

以下awk可以帮助你(使用提供的测试)。

echo "var1=prueba1&mod=SgaCac&mod=SgaGenSgm&env=&var2=prueba2" | awk -F"&" '{for(i=1;i<=NF;i++){if($i ~ /mod/){sub(/mod.*=/,"",$i);val=val?val "," $i:$i}};print val;val=""}'

输出如下。

SgaCac,SgaGenSgm

此处也添加非单线形式的解决方案。

echo "var1=prueba1&mod=SgaCac&mod=SgaGenSgm&env=&var2=prueba2" |
awk -F"&" '{
for(i=1;i<=NF;i++){
 if($i ~ /mod/){
   sub(/mod.*=/,"",$i);
   val=val?val "," $i:$i;
}
}
print val;
val="";
}'

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed -nr 'G;:a;s/mod=([^&\n]*)(.*)/\2,\1/;ta;s/.*\n,//p' file

在图案空间(PS)中添加换行符,并使用模式匹配将所需的字符串移动到换行符的右侧。删除所有字符,包括换行符,然后打印剩余部分。

N.B。这个习惯用法略有修改,使用,分隔符。

答案 5 :(得分:0)

$ awk -v RS='&' -F'=' '$1=="mod"{print $2}' file
SgaCac
SgaGenSgm

$ awk -v RS='&' -F'=' '$1=="mod"{o=o s $2; s=","} END{print o}' file
SgaCac,SgaGenSgm