【问题标题】:Escape backslash with sed command when the next character is "t" [duplicate]当下一个字符是“t”时,使用 sed 命令转义反斜杠 [重复]
【发布时间】:2018-02-07 07:55:25
【问题描述】:

我正在使用这个 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 周围的单引号,它会自动标记输出,所以我也不希望这样。

如何转义反斜杠,使其只打印一个反斜杠?

【问题讨论】:

  • 你试过\\t吗?
  • 是的,那没用

标签: bash sed escaping backslash bcftools


【解决方案1】:
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}'

【讨论】:

  • 感谢工作。现在,输出是多行,但我怎样才能在一行中得到所有内容?
【解决方案2】:

参考Bash Quoting

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

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多