Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed-如何根据图案替换线条?_Bash_Ubuntu_Sed - Fatal编程技术网

Bash sed-如何根据图案替换线条?

Bash sed-如何根据图案替换线条?,bash,ubuntu,sed,Bash,Ubuntu,Sed,我有一个宏文件,其中包含以下变量定义: SLIBS+=# USERDEFINED $(shell $(NETCDF_PATH)/bin/nc-config --flibs) CFLAGS:= -gopt -Mlist -time 我正在尝试使用sed替换SLIBS+=和CFLAGS:=的内容 例如,我正在尝试替换 SLIBS+=# USERDEFINED $(shell $(NETCDF_PATH)/bin/nc-config --flibs) 与 通过使用此命令: sed -i "s:S

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

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

CFLAGS:= -gopt -Mlist -time
我正在尝试使用
sed
替换
SLIBS+=
CFLAGS:=
的内容

例如,我正在尝试替换

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

通过使用此命令:

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


您只是缺少一个regex子表达式来捕获“SLIBS+=之后的行中的任何其他内容”。因此,只有准确的
SLIBS+=
被替换,之后的文本被保留(看起来像是被追加了)

将sed命令替换为eg

sed -i 's:SLIBS+=.*:SLIBS+= ... :g' Macros
应该这样做(注意添加的
*
以匹配任意数量的其他字符,以及
'
以防止shell转义
*

这种方法也适用于您的
CFLAGS

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
sed -i 's:SLIBS+=.*:SLIBS+= ... :g' Macros