sed - 如何根据模式替换线?

时间:2017-11-15 00:44:28

标签: bash ubuntu sed

我有一个Macros文件,其中包含如下变量定义:

SLIBS+=# USERDEFINED $(shell $(NETCDF_PATH)/bin/nc-config --flibs)

CFLAGS:= -gopt -Mlist -time

我正在尝试使用SLIBS+=替换CFLAGS:=sed的内容。

例如,我正在尝试替换

SLIBS+=# USERDEFINED $(shell $(NETCDF_PATH)/bin/nc-config --flibs)

SLIBS+= -L/sw/arcts/centos7/netcdf/4.4.1/pgi-16.4-hdf5-1.8.16/lib -lnetcdff -L/sw/arcts/centos7/netcdf/4.4.1/pgi-16.4-hdf5-1.8.16/lib -L/sw/arcts/centos7/hdf5/1.8.16-pgi-16.4/lib -lnetcdf -lnetcdf -llapack -lblas

使用此命令:

sed -i "s:SLIBS+=:SLIBS+= -L/sw/arcts/centos7/netcdf/4.4.1/pgi-16.4-hdf5-1.8.16/lib -lnetcdff -L/sw/arcts/centos7/netcdf/4.4.1/pgi-16.4-hdf5-1.8.16/lib -L/sw/arcts/centos7/hdf5/1.8.16-pgi-16.4/lib -lnetcdf -lnetcdf -llapack -lblas:g" Macros

但是新内容附加到旧内容,而不是替换旧内容。

我做错了什么?

另外,我如何使用CFLAGS变量替换

CFLAGS:= -gopt -Mlist -time

CFLAGS:= -gopt -Mlist -time -I/sw/arcts/centos7/netcdf/4.4.1/pgi-16.4-hdf5-1.8.16/include -I/sw/arcts/centos7/hdf5/1.8.16-pgi-16.4/include

1 个答案:

答案 0 :(得分:1)

您只是错过了一个正则表达式子表达式来捕获" SLIBS+="之后的其他内容。因此,只有正好 SLIBS+=被替换,之后的文本仍然存在(所以看起来就像是附加的)。

用例如

替换你的sed命令
sed -i 's:SLIBS+=.*:SLIBS+= ... :g' Macros

应该这样做(注意添加的.*匹配任意数量的其他字符和'以防止shell转义*。)

此方法也适用于您的CFLAGS