Regex 用某种方式写一行

Regex 用某种方式写一行,regex,windows,sed,Regex,Windows,Sed,我有一个文本文件,它的行是以某种格式制作的,就像下一行一样 bla bla name1=WORD1 bla bla name2=WORD2 bla bla name3=WORD2 我想提取WORD1 WORD2 WORD3而不使用所有bla bla,并用分号打印它们 WORD1;WORD2;WORD3 这可以只使用sed来完成吗?如果WORD*总是以这种方式出现,您可以使用这两种模式[^=]*=和[^]*分别匹配单词的前面和后面^在组的开头反转匹配。类似的内容在GNU sed中起作用:

我有一个文本文件,它的行是以某种格式制作的,就像下一行一样

bla bla name1=WORD1 bla    bla name2=WORD2 bla bla name3=WORD2
我想提取WORD1 WORD2 WORD3而不使用所有bla bla,并用分号打印它们

WORD1;WORD2;WORD3

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

如果
WORD*
总是以这种方式出现,您可以使用这两种模式
[^=]*=
[^]*
分别匹配单词的前面和后面<代码>^在组的开头反转匹配。类似的内容在GNU sed中起作用:

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

如果
WORD*
总是以这种方式出现,您可以使用这两种模式
[^=]*=
[^]*
分别匹配单词的前面和后面<代码>^在组的开头反转匹配。类似的内容在GNU sed中起作用:

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

如果你是在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}'

awk'{for(i=1;i如果您是在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}'

awk'{for(i=1;i处理不同
key=value
字符串的一种方法

假设
infle
包含内容:

bla bla name1=WORD1 bla   noname=WORD4 bla name2=WORD2 bla bla name3=WORD3
## 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/;[ ]*$//;
script.sed
,内容如下:

bla bla name1=WORD1 bla   noname=WORD4 bla name2=WORD2 bla bla name3=WORD3
## 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

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

假设
infle
包含内容:

bla bla name1=WORD1 bla   noname=WORD4 bla name2=WORD2 bla bla name3=WORD3
## 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/;[ ]*$//;
script.sed
,内容如下:

bla bla name1=WORD1 bla   noname=WORD4 bla name2=WORD2 bla bla name3=WORD3
## 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

是的,它假设
WORD*
在等号之后,如果其他人出现,这个方法会失败。我有一个想法,但我不知道sed中的语法;如何在sed中反向替换?我的意思是替换我使用sed的/word1//g',但我想要反向,替换除word1以外的任何东西,如何做?它工作了,但当我使用o时失败了r,sed的s/*\(word1\\;word2\)./\1/'为什么?它只匹配
\(word1\;word2\)
一次,如果您想匹配两者,请使用此构造
s/*\(word1\).*(word2\)./\1;\2/
或者使用
-r
s:.*(word1)。*(word2).*:\1;\2:
。是的,它假设
WORD*
位于等号之后,如果其他方法存在,则此方法失败。我有一个想法,但我不知道sed中的语法;如何在sed中进行反向替换?我的意思是替换我使用了sed的/word1//g',但我想要反向,替换除word1以外的任何东西,如何操作?它工作了,但它不起作用当我使用or时,sed的s/*\(word1\\;word2\)./\1/'为什么?它只匹配
\(word1\;word2\
一次,如果您想匹配两者,请使用此结构
s/*\(word1\).\(word2\)./\1;\2/
或者使用
-r
s:.*(word1)。*(word2).*:\1;\2:
。如果您在windows中安装了awk,它应该可以工作。我在Solaris unix中进行了测试。还请为windows标记它。如果您在windows中安装了awk,它应该可以工作。我在Solaris unix中进行了测试。还请为windows标记它。