Bash sed中s命令和寻址的正确语法

Bash sed中s命令和寻址的正确语法,bash,sed,Bash,Sed,我想从bash脚本发出此命令 sed-e$开始,$s/pattern/$variable/file 但任何可能的引号组合都会给我一个错误,只有一个是有效的: sed-e“$start,$”'s/pattern/$variable/'文件 也不好,因为它不会取消对变量的引用 我的方法可以用sed实现吗?请随意切换引号。外壳可以使事情保持直线 sed -e "$beginning"',$s/pattern/'"$variable"'/' file 您可以尝试以下方法: $ sed -e "$beg

我想从bash脚本发出此命令
sed-e$开始,$s/pattern/$variable/file

但任何可能的引号组合都会给我一个错误,只有一个是有效的:
sed-e“$start,$”'s/pattern/$variable/'文件

也不好,因为它不会取消对变量的引用


我的方法可以用sed实现吗?

请随意切换引号。外壳可以使事情保持直线

sed -e "$beginning"',$s/pattern/'"$variable"'/' file
您可以尝试以下方法:

$ sed -e "$beginning,$ s/pattern/$variable/" file
例子 file.txt:

one
two
three
ONE
two
three
尝试:

输出:

one
two
three
ONE
two
three

下面的表单在脚本中为我工作

sed $beg,$ -e s/pattern/$variable/ file

如果从shell执行,同样的表单也可以使用。有两种类型的引号:

  • 单引号保留其内容(
    是提示):

  • 双引号允许参数扩展:

    > var=blah
    > echo "$var"
    blah
    
和两种类型的
$
符号:

  • 一种方法是告诉shell下面是要展开的参数的名称
  • 在sed中代表“最后一行”的一个
你必须把这些结合起来

  • shell认为sed的
    $
    与参数无关
  • shell参数仍在展开(不能在单引号内)
  • 整个sed命令被引用
  • 一种可能是

    sed "$beginning,\$s/pattern/$variable/" file
    
    整个命令用双引号括起来,即参数被展开(
    $start
    $variable
    )。为了确保shell不会尝试展开不存在的
    $s
    ,会转义“行尾”
    $
    ,以便shell不会尝试任何有趣的操作

    其他选择包括

    • 重复引用所有内容,但在
      $
      s
      之间添加空格(请参阅)
    • 根据需要混合报价类型(参见)
    不起作用的方法 单引号中的所有内容:shell参数不展开(不遵循上面的规则2)
    $start
    不是有效地址,
    模式
    将被
    $variable
    替换

    sed "$beginning,$s/pattern/$variable/" file
    

    双qoutes中的所有内容:参数都被展开,包括
    $s
    ,它不应该(不遵循上面的规则1)。

    `sed-e“$begining,$s/pattern/$variable/”文件`That,并确保
    $variable
    不包含任何
    //code>,或者更改
    s/模式/替换/
    separator@JJoao从shell本身起作用,但从bash脚本
    sed:-e expression#1,char 1:unknown命令:`,
    启动时会出现错误,这将导致各种奇怪的行为,因为shell变量可能包含各种内容。始终引用您的shell变量,除非您心里有一个非常具体的目标,不这样做,并且完全理解所有的含义。如果你不能准确地理解术语globbing、分词和文件名扩展,那么在你做这件事之前一定要研究它们,否则你就不会去做。有关正确的引用,请参阅。
    sed "$beginning,$s/pattern/$variable/" file