为什么我的变量不能与sed命令一起删除带有模式的行?

时间:2019-07-31 22:17:51

标签: bash sed

我有一个重复行的文件。

FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID  TargetAtomName  NeighborAtomID    NeighborAtomName  BondLenght  NeighborAtomID  ...
FRAM_#            0            0(fs)  CN= 1 PRMRYTGT     16653      H    16652      O  0.988
  CN= 0 SBSDRYTGT     16652      O     16654      H  0.942     16653      H  0.988
    CN= 1 SBSDRYTGT     16654      H     16652      O  0.942
FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID  TargetAtomName  NeighborAtomID    NeighborAtomName  BondLenght  NeighborAtomID  ...
FRAM_#          100           25(fs)  CN= 1 PRMRYTGT     16653      H    16652      O  0.959
  CN= 0 SBSDRYTGT     16652      O     16654      H  1.012     16653      H  0.959
    CN= 1 SBSDRYTGT     16654      H     16652      O  1.012
FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID  TargetAtomName  NeighborAtomID    NeighborAtomName  BondLenght  NeighborAtomID  ...
FRAM_#          200           50(fs)  CN= 1 PRMRYTGT     16653      H    16652      O  0.991
  CN= 0 SBSDRYTGT     16652      O     16654      H  0.952     16653      H  0.991
......

我想使用变量删除那些重复的行 FrameNO Title Rule: Frame# time(fs) CN [Qn] LabelOfTargetType (PRMRYTGT or SBSDRYTGT) TargetAtomID TargetAtomName NeighborAtomID NeighborAtomName BondLenght NeighborAtomID ..

以下是我的命令:

key=`head -n 1 filename`; 
sed -i "/$key/d" filename;

我希望得到如下结果

FRAM_#            0            0(fs)  CN= 1 PRMRYTGT     16653      H    16652      O  0.988
  CN= 0 SBSDRYTGT     16652      O     16654      H  0.942     16653      H  0.988
    CN= 1 SBSDRYTGT     16654      H     16652      O  0.942
FRAM_#          100           25(fs)  CN= 1 PRMRYTGT     16653      H    16652      O  0.959
  CN= 0 SBSDRYTGT     16652      O     16654      H  1.012     16653      H  0.959
    CN= 1 SBSDRYTGT     16654      H     16652      O  1.012
FRAM_#          200           50(fs)  CN= 1 PRMRYTGT     16653      H    16652      O  0.991
  CN= 0 SBSDRYTGT     16652      O     16654      H  0.952     16653      H  0.991
    CN= 1 SBSDRYTGT     16654      H     16652      O  0.952
FRAM_#          300           75(fs)  CN= 1 PRMRYTGT     16653      H    16652      O  0.952
  CN= 0 SBSDRYTGT     16652      O     16654      H  0.987     16653      H  0.952
    CN= 1 SBSDRYTGT     16654      H     16652      O  0.987
.......

但是,以上命令不起作用。如果我使用

sed -i '/FrameNO/d' filename;

我可以得到正确的结果。

我试图设置变量

keyword=FrameNO

,我无法获得正确的结果。

我可以知道使用变量时出了什么问题吗?我该如何解决?谢谢。

1 个答案:

答案 0 :(得分:2)

该行包含[]个字符,这些字符在正则表达式中具有特殊含义。您需要对其进行转义,以便从字面上进行匹配。

key=$(head -n 1 filename)
key=${key//\[/\\[}
key=${key//\]/\\]}

${variable//pattern/replacement}pattern值中的通配符replacement的所有匹配替换为$variable

但是可以使用sed而不是使用grep -F,它执行精确匹配而不是匹配正则表达式。然后,您无需进行上述替换。

grep -v -F "$key" filename > filename.new && mv filename.new filename