s命令的正确语法以及sed中的寻址

时间:2016-04-16 09:47:41

标签: bash sed

我想从bash脚本发出这个命令 sed -e $beginning,$s/pattern/$variable/ file

但任何可能的引号组合都会给我一个错误,只有一个错误: sed -e "$beginning,$"'s/pattern/$variable/' file

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

我的方法是否可以用sed实现?

4 个答案:

答案 0 :(得分:1)

随意切换报价。外壳可以保持平直。

sed -e "$beginning"',$s/pattern/'"$variable"'/' file

答案 1 :(得分:0)

你可以试试这个:

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

实施例

<强> file.txt的:

one
two
three

尝试:

$ beginning=1
$ variable=ONE
$ sed -e "$beginning,$ s/one/$variable/" file.txt

<强>输出:

ONE
two
three

答案 2 :(得分:0)

有两种类型的报价:

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

    > var=blah
    > echo '$var'
    $var
    
  • 双引号允许参数扩展:

    > var=blah
    > echo "$var"
    blah
    

两种$符号:

  • 告诉shell,接下来是要扩展的参数的名称
  • 一个代表sed。中的“最后一行”。

你必须将这些结合起来

  1. shell认为sed的$与参数
  2. 无关
  3. shell参数仍然会扩展(不能在单引号内)
  4. 引用了整个sed命令。
  5. 一种可能性是

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

    整个命令是双引号,即参数得到扩展($beginning$variable)。为了确保shell不会尝试展开不存在的$s,“行尾”$将被转义,因此shell不会尝试任何有趣的事情。

    其他选项

    • 引用所有内容,但在$s之间添加空格(请参阅Ren's answer
    • 根据需要混合引用类型(请参阅Ignacio's answer

    不起作用的方法

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

    单引号中的所有内容:shell参数未展开(不遵循上面的规则2)。 $beginning不是有效地址,pattern将被$variable字面替换。

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

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

答案 3 :(得分:-1)

以下表单在脚本

中为我工作
sed $beg,$ -e s/pattern/$variable/ file

如果从shell

执行,同样的表单也会起作用