2017-10-06 41 views
1

我有一個帖子的結果,我想用「MOD =」打印所有出現的背單詞,如果可能,他們有獨立的,SED:在一條線上,並打印下一個單詞的多個模式

例:

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

查看https://ideone.com/COy7Vc –

回答

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='&'記錄/行分離器&,這樣它會覆蓋,默認行分離器換行符炭(\n),所以awk將解釋&作爲行尾。

  • -v OFS=','輸出字段分隔符爲逗號

  • /^mod/如果符合正則表達式開始,然後

  • v=(v ? v OFS:"")$2串聯可變v與如果存在,其中分離器是逗號現有內容,和第二場($2),其他只是第二個字段

  • END{print v}最後打印變量v內容

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 
0

與sed的

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

使用awk

awk -F"=|&" '{print $4","$6}' 
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=""; 
}' 
0

這可能會爲你工作(GNU SED):

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

追加一個換行符的模式空間(PS)和使用模式匹配所需的字符串(一個或多個)移動到右面新隊。刪除所有包含換行符的字符並打印剩餘的字符。

N.B.這個成語已被稍微修改爲使用,分隔符。

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 
相關問題