我想将变量递归替换为文本文件,可能使用正则表达式,这是一个非常简单的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
我真的非常感谢你,这将是一个了解这些东西的绝佳机会。
答案 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