sed以某种方式写一条线

时间:2012-08-31 10:04:10

标签: regex windows sed

我有这个文本文件,其行以某种格式制作,就像下一行

一样
bla bla name1=WORD1 bla    bla name2=WORD2 bla bla name3=WORD2

我想在没有所有bla bla的情况下提取WORD1 WORD2 WORD3并用分号打印

WORD1;WORD2;WORD3

这可以仅使用sed吗?

3 个答案:

答案 0 :(得分:2)

处理不同key=value字符串的一种方法。

假设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

答案 1 :(得分:1)

如果WORD*始终以这种方式出现,您可以使用这两种模式[^=]*=[^ ]*分别匹配之前和单词。在组的开头^反转匹配。这样的东西适用于GNU sed:

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

答案 2 :(得分: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}'

测试如下:

> 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
>