具有精确变量变化的Sed命令

时间:2016-07-27 08:21:49

标签: linux shell

我想用sed命令替换精确的单词和变量。我的文件看起来像这样:

//module xyz
module xyz 

假设我定义了以下shell变量:

var1='module xyz'
var2='module abc'

我想仅在未注释的行(模块xyz)中将xyz更改为abc

执行命令输出后应该是

//module xyz    
module abc

我不想更改注释行(// module xyz)

目前我正在使用sed命令,

sed -i "s|$var1|$var2|g" file_name

但是这个命令不起作用。它还取代了评论行。我怎样才能替换未注释的行?

3 个答案:

答案 0 :(得分:0)

假设您知道该模式位于该行的开头,您可以使用:

sed "s|^$var1|$var2|" file_name

即添加一个锚^,以便匹配必须位于该行的开头。

我删除了-i开关,因此您可以测试它以及g修饰符,这不是必需的,因为您只想每行进行一次替换。

值得一提的是,在sed中使用shell变量实际上是quite tricky to do in a reliable way,所以你应该考虑到这一点。

答案 1 :(得分:0)

  • 如果有空格,应引用shell变量赋值。像:

    var1="foo bar blah"
    
  • 您可以添加模式,"这些行不会以//"到您的sed命令,以便只替换那些行

此行适用于您的示例:

sed -i "\@^//@\!s/$var1/$var2/g" file
  • !需要转义,因为我们使用双引号
  • 由于您的模式(注释)有斜杠(/),我使用其他char作为正则表达式分隔符
  • 此命令仅对不以//开头的行进行替换。如果存在前导空格,您可能需要调整模式^//

答案 2 :(得分:0)

您需要识别模式,以便不应处理包含该模式的行。 假设textCardNumber.setText("Card Number: " + mActivity.maskedAccountNumber.replaceAll("(.{4})(?!$)", "$1 ")); 仅存在于注释行中,您可以使用

//

sed -i '/\/\// !s/$var1/$var2/g' file_name将使sed能够识别包含模式/\/\//的行,而//将使您能够跳过这些行。