regex 删除模式之间的逗号

mlmc2os5  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(132)

我尝试使用sed将文本文件中的所有逗号替换为“;”和“[”之间的空格。示例行是:K01810,GPI,,pgi;,glucose-6-phosphate,isomerase,[EC:5.3.1.9],其中我的理想输出是K01810,GPI,,pgi; glucose-6-phosphate isomerase [EC:5.3.1.9]
我试过sed 's/;\(.*\)\[/;\1[/g' myfile.txt > newfile,但这并没有改变什么。
myfile.txt:

09100,Metabolism
09101,Carbohydrate,metabolism
00010,Glycolysis,/,Gluconeogenesis,[PATH:ko00010]
K00844,HK;,hexokinase,[EC:2.7.1.1]
K12407,GCK;,glucokinase,[EC:2.7.1.2]
K00845,glk;,glucokinase,[EC:2.7.1.2]
K25026,glk;,glucokinase,[EC:2.7.1.2]
K01810,GPI,,pgi;,glucose-6-phosphate,isomerase,[EC:5.3.1.9]
K06859,pgi1;,glucose-6-phosphate,isomerase,,archaeal,[EC:5.3.1.9]
K13810,tal-pgi;,transaldolase,/,glucose-6-phosphate,isomerase,[EC:2.2.1.2,5.3.1.9]
K15916,pgi-pmi;,glucose/mannose-6-phosphate,isomerase,[EC:5.3.1.9,5.3.1.8]
K24182,PFK9;,6-phosphofructokinase,[EC:2.7.1.11]
K00850,pfkA,,PFK;,6-phosphofructokinase,1,[EC:2.7.1.11]
K16370,pfkB;,6-phosphofructokinase,2,[EC:2.7.1.11]

字符串

2lpgd968

2lpgd9681#

sed '
    # skip lines that do not match
    /^\(.*\)\(;.*\[\)\(.*\)$/ ! b

    # save a copy of original line
    h

    # extract prefix/suffix
    s//\1\n\3/

    # save them, restore original line
    x

    # extract part to change
    s//\2/

    # do the substitution
    y/,/ /

    # append prefix/suffix
    G

    # rearrange
    s/^\([^\n]*\)\n\([^\n]*\)\n/\2\1/
    
' myfile.txt >newfile

字符串

**注意:**为了便于移植,需要使用转义的文本换行符来替换(某些版本的sed将\n视为n):

# ...

    # extract prefix/suffix
    s//\1\
\3/

    # ...

pxy2qtax

pxy2qtax2#

这可能对你有用(GNU sed):

sed -E ':a;s/(;[^,[]*),/\1 /;ta' file

字符串
匹配以;开头且不包含[,的任何连续字符,后跟,,并将,替换为空格。
如果替换成功,则重复直到失败。

at0kjp5o

at0kjp5o3#

使用这个Perl一行程序:

perl -pe 's{(;[^;\[]+)}{ do { $s = $1; $s =~ tr/,/ /; $s } }e; ' infile > outfile

字符串
或就地更改:

perl -i.bak -pe 's{(;[^;\[]+)}{ do { $s = $1; $s =~ tr/,/ /; $s } }e; ' infile


Perl一行程序使用以下命令行标志:
-e:告诉Perl在线查找代码,而不是在文件中。
-p:一次循环一行输入,默认情况下将其分配给$_。每次循环迭代后添加print $_
-i.bak:就地编辑输入文件(覆盖输入文件)。在重新编译之前,通过在其名称后面附加扩展名.bak来保存原始文件的备份副本。如果您想跳过写入备份文件,只需使用-i并跳过扩展名。
正则表达式使用这个修饰符:
/e:将REPLACEMENT作为s/PATTERN/REPLACEMENT/中的表达式求值
s{PATTERN}{EXPRESSION}:将PATTERN替换为EXPRESSION
(;[^;\[]+):文字;,后跟1个或多个除;[之外的任何字符(注意必须转义:\[。括号将匹配捕获到变量$1中。
do { $s = $1; $s =~ tr/,/ /; $s }:将$1重新分配给$s,然后将所有出现的,更改为``(空格)。该块返回最后一个表达式,即更改后的变量$s

参见:

j1dl9f46

j1dl9f464#

使用GNU awk作为match()的第三个参数:

$ awk 'match($0,/(.*;)([^[]+)(\[.*)/,a) {
    $0 = a[1] gensub(/,/," ","g",a[2]) a[3]
} 1' file
09100,Metabolism
09101,Carbohydrate,metabolism
00010,Glycolysis,/,Gluconeogenesis,[PATH:ko00010]
K00844,HK; hexokinase [EC:2.7.1.1]
K12407,GCK; glucokinase [EC:2.7.1.2]
K00845,glk; glucokinase [EC:2.7.1.2]
K25026,glk; glucokinase [EC:2.7.1.2]
K01810,GPI,,pgi; glucose-6-phosphate isomerase [EC:5.3.1.9]
K06859,pgi1; glucose-6-phosphate isomerase  archaeal [EC:5.3.1.9]
K13810,tal-pgi; transaldolase / glucose-6-phosphate isomerase [EC:2.2.1.2,5.3.1.9]
K15916,pgi-pmi; glucose/mannose-6-phosphate isomerase [EC:5.3.1.9,5.3.1.8]
K24182,PFK9; 6-phosphofructokinase [EC:2.7.1.11]
K00850,pfkA,,PFK; 6-phosphofructokinase 1 [EC:2.7.1.11]
K16370,pfkB; 6-phosphofructokinase 2 [EC:2.7.1.11]

字符串
或者你可以使用任何awk来做同样的事情:

awk 'match($0,/(.*;)([^[]+)(\[.*)/) {
    tgt = substr($0,RSTART,RLENGTH); gsub(/,/," ",tgt)
    $0 = substr($0,1,RSTART-1) tgt substr($0,RSTART+RLENGTH)
} 1' file

相关问题