Linux 具有精确变量更改的Sed命令
我想用变量替换sed命令中的确切单词。我的文件如下所示:Linux 具有精确变量更改的Sed命令,linux,shell,Linux,Shell,我想用变量替换sed命令中的确切单词。我的文件如下所示: //module xyz module xyz 假设我定义了以下shell变量: var1='module xyz' var2='module abc' 我只想将未注释行中的xyz更改为abc(模块xyz) 所以在执行命令后,输出应该是 //module xyz module abc 我不想更改注释行(//模块xyz) 目前我使用sed命令作为 sed -i "s|$var1|$var2|g" file_name 但是这
//module xyz
module xyz
假设我定义了以下shell变量:
var1='module xyz'
var2='module abc'
我只想将未注释行中的xyz更改为abc(模块xyz)
所以在执行命令后,输出应该是
//module xyz
module abc
我不想更改注释行(//模块xyz)
目前我使用sed命令作为
sed -i "s|$var1|$var2|g" file_name
但是这个命令不起作用。它还替换了注释行。如何仅替换未注释的行?假设您知道模式位于行的开头,您可以使用以下方法:
sed "s|^$var1|$var2|" file_name
也就是说,添加锚点^
,以便匹配必须位于行的开头
我删除了-I
开关,以便您可以测试它以及g
修饰符,这是不必要的,因为您只希望每行进行一次替换
值得一提的是,在sed中使用shell变量实际上是一种错误,因此您应该考虑到这一点。假设您知道模式位于行的开头,您可以使用以下方法:
sed "s|^$var1|$var2|" file_name
也就是说,添加锚点^
,以便匹配必须位于行的开头
我删除了-I
开关,以便您可以测试它以及g
修饰符,这是不必要的,因为您只希望每行进行一次替换
值得一提的是,在sed中使用shell变量实际上是错误的,因此您应该考虑到这一点。- 如果有空格,则应引用shell变量赋值。比如:
var1="foo bar blah"
- 您可以在sed命令中添加模式“行不以//开头”,以便只替换这些行
sed -i "\@^//@\!s/$var1/$var2/g" file
代码>需要转义,因为我们使用了双引号
- 因为您的模式(注释)有斜杠(
),所以我使用了其他字符作为正则表达式分隔符/
- 此命令仅对不以
开头的行进行替换。如果有前导空格,您可能需要调整模式/
^/
- 如果有空格,则应引用shell变量赋值。比如:
var1="foo bar blah"
- 您可以在sed命令中添加模式“行不以//开头”,以便只替换这些行
sed -i "\@^//@\!s/$var1/$var2/g" file
代码>需要转义,因为我们使用了双引号
- 因为您的模式(注释)有斜杠(
),所以我使用了其他字符作为正则表达式分隔符/
- 此命令仅对不以
开头的行进行替换。如果有前导空格,您可能需要调整模式/
^/
/
只存在于您可以使用的注释行中
sed-i'/\/\/!s/$var1/$var2/g'文件名
/\/\/
将使sed能够识别包含模式/
和的行!将允许您跳过这些行。您需要标识一个模式,以便不处理包含该模式的行。
假设/
只存在于您可以使用的注释行中
sed-i'/\/\/!s/$var1/$var2/g'文件名
/\/\/
将使sed能够识别包含模式/
和的行!s
将允许您跳过这些行。var1=module xyz
assingsmodule
到var1
并运行xyz
@choroba我的错误,我编辑了那个部分,将修复。var1=module xyz
assingsmodule
到var1
并运行xyz@choroba我的错误,我编辑了那个部分,我会修好的。