我有一个帖子的结果,我想用" 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
答案 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