2012-08-31 86 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