Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Linux 具有精确变量更改的Sed命令_Linux_Shell - Fatal编程技术网

Linux 具有精确变量更改的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 但是这

我想用变量替换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

但是这个命令不起作用。它还替换了注释行。如何仅替换未注释的行?

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

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
      assings
      module
      var1
      并运行
      xyz
      @choroba我的错误,我编辑了那个部分,将修复。
      var1=module xyz
      assings
      module
      var1
      并运行
      xyz@choroba我的错误,我编辑了那个部分,我会修好的。