Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed 在特定字符串之间替换字符_Sed - Fatal编程技术网

Sed 在特定字符串之间替换字符

Sed 在特定字符串之间替换字符,sed,Sed,我想将两个特定字符串(DP&MQ)之间的每个逗号替换为分号 输入 预期产量 0,0,0,DP=1;1;1;1;MQ=2,2,2 我在DP&MQ前后有不同数量的字段,所以我认为sed是最好的。我不想在DP之前或MQ之后替换逗号。你们谁能帮帮我我知道应该是这样的 sed's/DP=,,,,MQ/DP=somethingMQ/g' 如果您使用了gnu,请提前感谢:,这应该适用于您的示例: sed -r 's/(.*DP=)(.*)(MQ=.*)/echo -n \1;echo -n \2 \|tr

我想将两个特定字符串(DP&MQ)之间的每个逗号替换为分号

输入

预期产量

0,0,0,DP=1;1;1;1;MQ=2,2,2
我在DP&MQ前后有不同数量的字段,所以我认为sed是最好的。我不想在DP之前或MQ之后替换逗号。你们谁能帮帮我我知道应该是这样的

sed's/DP=,,,,MQ/DP=somethingMQ/g'


如果您使用了gnu,请提前感谢:

,这应该适用于您的示例:

sed -r 's/(.*DP=)(.*)(MQ=.*)/echo -n \1;echo -n \2 \|tr "," ";"; echo -n \3/ge' input
用你的例子来测试

kent$  sed -r 's/(.*DP=)(.*)(MQ=.*)/echo -n \1;echo -n \2 \|tr "," ";"; echo -n \3/ge' <<<"0,0,0,DP=1,1,1,1,MQ=2,2,2"
0,0,0,DP=1;1;1;1;MQ=2,2,2
kent$sed-r的/(.*DP=)(.*)(MQ=.*)/echo-n\1;echo-n\2\|tr“,”;echo-n\3/ge'这可能适合您(GNU-sed):

这个sed习惯用法,标记有问题的字符串(使用换行符),复制标记行,修改字符串,然后将原始行与修改后的字符串组合

字符串的标记可能必须更加具体,即:

sed -r 's/DP=[^=]*MQ=/\n&\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file
如果只有部分文件可能包含有问题的字符串,请使用:

sed -r '/DP=[^=]*MQ=/{s//\n&\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/}' file     
下面的代码将执行以下操作:

awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
测试:

> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
0,0,0,DP=1;1;1;1;MQ=2,2,2
> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | perl -F"=" -ane '$F[1]=~s/,/;/g;print join "=",@F'
0,0,0,DP=1;1;1;1;MQ=2,2,2
或者您可以使用:

perl -plne '$_=~/DP=(.*)MQ/;$a=$1;$a=~s/,/;/g;$_=~s/(.*DP=).*(MQ.*$)/$1$a$2/g'
测试:

> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | perl -plne '$_=~/DP=(.*)MQ/;$a=$1;$a=~s/,/;/g;$_=~s/(.*DP=).*(MQ.*$)/$1$a$2/g'
0,0,0,DP=1;1;1;1;MQ=2,2,2

测试:

> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
0,0,0,DP=1;1;1;1;MQ=2,2,2
> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | perl -F"=" -ane '$F[1]=~s/,/;/g;print join "=",@F'
0,0,0,DP=1;1;1;1;MQ=2,2,2

使用awk,您可以这样做(前提是不再有=存在)

输出

0,0,0,DP=1;1.1.1.MQ=2,2,2

> echo "0,0,0,DP=1,1,1,1,MQ=2,2,2" | perl -F"=" -ane '$F[1]=~s/,/;/g;print join "=",@F'
0,0,0,DP=1;1;1;1;MQ=2,2,2
awk -F"=" '{gsub(",",";",$2); $1 = $1; print $1"="$2"="$3}' temp.txt