2012-08-31 134 views
0

我有有一定的格式,只是這樣的下一行的sed以某種方式

bla bla name1=WORD1 bla bla name2=WORD2 bla bla name3=WORD2 

我想提取WORD1 WORD2 WORD3沒有所有的喇嘛喇嘛和印刷製作線這個文本文件中寫了一行他們用分號

WORD1;WORD2;WORD3 

這可以使用只有sed?

+0

你試過了什麼? – Oussama

回答

1

如果WORD*總是以這種方式出現,則可以分別使用這兩個模式[^=]*=[^ ]*來匹配before和word。在組的開始處的^反轉匹配。像這樣的東西可以在GNU sed中使用:

sed -r 's/[^=]*=([^ ]*)[^=]*=([^ ]*)[^=]*=(.*)/\1;\2;\3/' infile 
+0

工作;),你今天救了我兩次 – Leo92

+0

但是這會增加其他的東西,如果bla bla有'='對嗎? – Leo92

+0

是的,它假定'WORD *'出現在等號後面,如果其他人出現,則此方法失敗。 – Thor

1

如果你在awk中被交叉,那麼下面的代碼就可以工作。

awk '{for(i=1;i<=NF;i++){if($i~/\=/){split($i,a,"=");if(p){p=p";"a[2]}else{p=a[2]}}}}END{print p}' 

如下測試:

,處理不同的 key=value
> echo "bla bla name1=WORD1 bla bla name2=WORD2 bla bla name3=WORD2" | awk '{for(i=1;i<=NF;i++){if($i~/\=/){split($i,a,"=");if(p){p=p";"a[2]}else{p=a[2]}}}}END{print p}' 
WORD1;WORD2;WORD2 
> 
+0

可以在windows下工作嗎? – Leo92

+0

如果您在windows.it中安裝了awk,應該可以正常工作。我已經在Solaris unix中進行了測試。也請標記爲windows。 – Vijay

2

的一種方式。

假設infile的內容:與內容

bla bla name1=WORD1 bla noname=WORD4 bla name2=WORD2 bla bla name3=WORD3 

而且script.sed

## Add a newline character just before each word. 
s/name[1-3]=\([^ ]*\)/\n\1/g; 

## Remove all characters until each newline appended in previous command, so only 
## words will be left, and insert a ';' between them. 
s/[^\n]*\n\([^ ]*\)/\1;/g; 

## Remove last ';'. 
s/;[ ]*$//; 

運行它想:

sed -f script.sed infile 

國債收益率:

WORD1;WORD2;WORD3