我想用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
但是这个命令不起作用。它还取代了评论行。我怎样才能替换未注释的行?
答案 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能够识别包含模式/\/\//
的行,而//
将使您能够跳过这些行。