1

我正在使用这个 sed 命令将字符串替换"##INFO=<ID=""\t%"

bcftools view -h /data/ExAC.r1.sites.vep.vcf | grep "^##INFO=<ID=" | sed $'/^##INFO=<ID=/{ s//'\t%INFO' /; s/,.*//; p; }''

但我得到的正是我想要的输出,而不是反斜杠,它不打印任何东西。如果我删除 sed 命令中的单引号\t%INFO,它会自动标记输出,所以我也不希望这样。

我怎样才能逃避反斜杠,以便它只打印一个反斜杠?

4

2 回答 2

4
sed $'/^##INFO=<ID=/{ s//'\t%INFO' /; s/,.*//; p; }''

1.)前面的美元符号似乎没有意义

sed '/^##INFO=<ID=/{ s//'\t%INFO' /; s/,.*//; p; }''

2.) 你不能只嵌套单引号。我不知道这是如何“工作”的,我没想到会这样。

sed '/^##INFO=<ID=/{ s//\t%INFO /; s/,.*//; p; }'

3.) 这会将字符串替换为一个制表符,然后是一个 %INFO。然后打印它。逃脱一次。

sed '/^##INFO=<ID=/{ s//\\t%INFO /; s/,.*//; p; }'

4.) 这用 \t%INFO 替换刺痛然后打印它,产生选项卡 %INFO。再次逃脱。

sed '/^##INFO=<ID=/{ s//\\\\t%INFO /; s/,.*//; p; }'

5.)这应该有效。

但是使用捕获组有一个更简单的答案。看起来你正在寻找这个?

bcftools view -h /data/ExAC.r1.sites.vep.vcf \
| grep "^##INFO=<ID=" \
| sed -E 's/^##INFO=<ID=([^,]*),.*/\\t%INFO \1/' 

全部上线:

bcftools view -h /data/ExAC.r1.sites.vep.vcf \
| grep "^##INFO=<ID=" \
| sed -E 's/^##INFO=<ID=([^,]*),.*/\\t%INFO \1/' \
| awk '{printf "%s ", $0}'
于 2017-08-29T19:11:30.993 回答
1

参考Bash 报价

$'string' 被称为 ANSI C 引用解释反斜杠序列,只是使用单引号引用来避免解释字符,缺点是它不能包含单引号,但可以连接不同的字符串 qutoed。

于 2017-08-29T19:11:48.463 回答