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标记它。