文本文件中的递归替换(正则表达式)

时间:2015-03-06 17:21:23

标签: regex bash recursion sed

我想将变量递归替换为文本文件,可能使用正则表达式,这是一个非常简单的bash脚本。

这是我的文本文件:

 ###MS: 12/
 ###MSMS: 13/
 BEGIN IONS
 TITLE= Cmpd 1, +MSn(507.7145), 0.1 min
 PEPMASS=507.71453  5708

 ###MS: 12/
 ###MSMS: 14/
 BEGIN IONS
 TITLE= Cmpd 2, +MSn(637.6461), 0.1 min
 PEPMASS=637.64610  8328

文本文件由同一结构块的多次重复组成(如图所示):我想要实现的是用TITLE= Cmpd之后的数字替换后面的数字###MSMS。这应该针对每个块进行,滚动文本文件,为每个块分配Cmpd一个MSMS值。

我尝试使用sed,使用之前在StackOverflow上解释过的脚本,但使用Cmpd [0-9]仅适用于第二部分(替换)但不适用于{之后的数字选择{1}}。

MSMS

我真的非常感谢你,这将是一个了解这些东西的绝佳机会。

1 个答案:

答案 0 :(得分:1)

您可以使用保持缓冲区来完成此操作。在sed中,h命令将当前模式空间复制到保留缓冲区中,G命令检索该模式并使用换行符将其附加到模式空间。

下面的sed脚本提取MSMS编号并将其存储在模式缓冲区中,然后当它看到TITLE行时,它将该行与保存的编号连接起来,然后用保存的值替换它找到的第一个数字序列最后的结果(以及附加数据的抛弃。)

#!/usr/bin/sed -f
/^###MSMS:/{
p
s/[^0-9]//g
h
d
}
/^TITLE=/{
G
s/\([^0-9]*\)[0-9]*\(.*\)\n\(.*\)/\1\3\2/
}

在提供的样本数据上运行此脚本会产生:

###MS: 12/
###MSMS: 13/
BEGIN IONS
TITLE= Cmpd 13, +MSn(507.7145), 0.1 min
PEPMASS=507.71453  5708

###MS: 12/
###MSMS: 14/
BEGIN IONS
TITLE= Cmpd 14, +MSn(637.6461), 0.1 min
PEPMASS=637.64610  8328