0

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

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

我想提取没有所有 bla bla 的 WORD1 WORD2 WORD3 并用分号打印它们

WORD1;WORD2;WORD3

这可以只使用 sed 来完成吗?

4

3 回答 3

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
于 2012-08-31T11:13:12.247 回答
1

如果WORD*总是以这种方式出现,你可以使用这两种模式[^=]*=[^ ]*分别匹配before和word。^在组的开头反转匹配。这样的东西在 GNU sed 中有效:

sed -r 's/[^=]*=([^ ]*)[^=]*=([^ ]*)[^=]*=(.*)/\1;\2;\3/' infile
于 2012-08-31T10:14:45.887 回答
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
> 
于 2012-08-31T10:15:22.237 回答