使用sed替换包含特殊字符的字符串

时间:2016-03-08 11:58:22

标签: sed

我正在尝试编辑一些fastq文件。

基本上我想改变:

@SRX1409044.10.1 10 length=80

为:

@SRX1409044.10/1 10 length=80

表示文件中包含.1的每一行。

我尝试过使用sed:

sed 's#.1#/1#g'

适用于大多数行,但适用于以下行:

@SRX1409044.11.1 11 length=80

我明白了:

@SRX1409044./1/1 /1 length=80

我有一个搜索周围,我想我可能要逃避特殊字符?我遇到的每一篇文章都只提供了自己交换特殊字符的例子,所以我不太清楚如何去做。

2 个答案:

答案 0 :(得分:0)

小数点.将转义为\.

我认为您的问题是需要区分单个数字和两位数。

如果您的数字不超过2位,最简单的方法是重复两次正则表达式,例如:

[0-9][0-9]

匹配任何2位数字或数字序列。

  • 因为我不知道你使用的是哪种版本的 sed ,以及它的增强功能是什么。

此外,我不确定你想接受什么,以及你想拒绝什么。

答案 1 :(得分:0)

此命令将第一次出现的.1 (每个行上的一个点后跟一个1和一个空格)更改为/1 - 注意转义的.:< / p>

sed 's|\.1 |/1 |' infile

对于示例输入文件,例如

@SRX1409044.10.1 10 length=80
@SRX1409044.12.1 10 length=80
@SRX1409044.14.1 10 length=80
@SRX1409044.15.1 10 length=80
@SRX1409044.990.1 10 length=80

结果是

@SRX1409044.10/1 10 length=80
@SRX1409044.12/1 10 length=80
@SRX1409044.14/1 10 length=80
@SRX1409044.15/1 10 length=80
@SRX1409044.990/1 10 length=80

现在,如果.1也可能在一行的末尾,我们必须稍微更改命令,因为我们现在需要一个空格:

sed 's#\.1\( \|$\)#/1\1#' infile

这是&#34; .1后跟空格或行尾,替换为/1以及.1&#34;之后的任何内容。例如:

$ sed 's#\.1\( \|$\)#/1\1#' <<< 'SRX1409044.116884523.1'
SRX1409044.116884523/1