如何在某行上方设置变量的输出?

时间:2019-06-13 16:53:44

标签: linux bash awk sed

我需要修改包含此字符串的行上方的文件: [分子类型]

我要执行的插入操作保存在这样的变量中:

ATOMTYPES=$(sed -n '/^\[\ atomtypes\ \]/,/^\[\ moleculetype\ \]/p;/^\[\ moleculetype\ \]/q' LIG_GMX.top | sed '$d')

其中包含以下文本:

[ atomtypes ]
;name   bond_type     mass     charge   ptype   sigma         epsilon       Amb
 oh       oh          0.00000  0.00000   A     3.06647e-01   8.80314e-01 ; 1.72  0.2104
 nc       nc          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700
 nd       nd          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700
 na       na          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700
 c3       c3          0.00000  0.00000   A     3.39967e-01   4.57730e-01 ; 1.91  0.1094
 ca       ca          0.00000  0.00000   A     3.39967e-01   3.59824e-01 ; 1.91  0.0860
 ho       ho          0.00000  0.00000   A     0.00000e+00   0.00000e+00 ; 0.00  0.0000
 h1       h1          0.00000  0.00000   A     2.47135e-01   6.56888e-02 ; 1.39  0.0157
 ha       ha          0.00000  0.00000   A     2.59964e-01   6.27600e-02 ; 1.46  0.0150

我想要的输出如下:

[ atomtypes ]
;name   bond_type     mass     charge   ptype   sigma         epsilon       Amb
 oh       oh          0.00000  0.00000   A     3.06647e-01   8.80314e-01 ; 1.72  0.2104
 nc       nc          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700
 nd       nd          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700
 na       na          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700
 c3       c3          0.00000  0.00000   A     3.39967e-01   4.57730e-01 ; 1.91  0.1094
 ca       ca          0.00000  0.00000   A     3.39967e-01   3.59824e-01 ; 1.91  0.0860
 ho       ho          0.00000  0.00000   A     0.00000e+00   0.00000e+00 ; 0.00  0.0000
 h1       h1          0.00000  0.00000   A     2.47135e-01   6.56888e-02 ; 1.39  0.0157
 ha       ha          0.00000  0.00000   A     2.59964e-01   6.27600e-02 ; 1.46  0.0150

[ moleculetype ]

但是,当我使用以下命令时:

sed "/^\[\ moleculetype\ \]/i | echo  $ATOMTYPES|" topol.top

sed "/^\[\ moleculetype\ \]/i  $ATOMTYPES" topol.top

出现以下错误:

sed: -e expression #1, char 50: extra characters after command

1 个答案:

答案 0 :(得分:1)

这是错误的做法。 sed用于对单个字符串进行s / old / new。对于更多有趣的事情,您应该使用awk。这可能就是您想要的(未经测试,因为您没有提供我们可以测试的示例输入/输出):

awk '
NR==FNR {
    if ( /\[ atomtypes ]/ )    { f=1 }
    if ( /\[ moleculetype ]/ ) { f=0 }
    if ( f ) {
        atomtypes = atomtypes ors $0
        ors = ORS
    }
    next
}
/\[ moleculetype ]/ { print atomtypes }
{ print }
' LIG_GMX.top topol.top

如果您使用的是GNU awk,则可以将f=0更改为nextfile以提高效率。