代码之家  ›  专栏  ›  技术社区  ›  Vijay

使用变量替换shell脚本中的字符串

  •  71
  • Vijay  · 技术社区  · 14 年前

    echo $LINE | sed -e 's/12345678/"$replace"/g'
    

    但它正在被取代 $replace 而不是那个变量的值。

    谁能告诉我出了什么问题吗?

    9 回复  |  直到 9 年前
        1
  •  157
  •   oguz ismail    4 年前

    如果你想解释 $replace ,不应使用单引号,因为它们阻止变量替换。

    echo $LINE | sed -e "s/12345678/${replace}/g"
    

    文字记录:

    pax> export replace=987654321
    pax> echo X123456789X | sed "s/123456789/${replace}/"
    X987654321X
    pax> _
    

    小心确保 ${replace} sed / 例如)除非逃脱,否则会引起混乱。但是,如果,如你所说,你用另一个数字替换一个数字,那应该不是问题。

        2
  •  77
  •   ghostdog74    14 年前

    $ var="12345678abc"
    $ replace="test"
    $ echo ${var//12345678/$replace}
    testabc
    
        3
  •  29
  •   bob    5 年前

    不是针对某个问题,而是针对那些需要从以前的答案中扩展相同功能以使其清晰的人:

    # create some variables
    str="someFileName.foo"
    find=".foo"
    replace=".bar"
    # notice the the str isn't prefixed with $
    #    this is just how this feature works :/
    result=${str//$find/$replace}
    echo $result    
    # result is: someFileName.bar
    
    str="someFileName.sally"
    find=".foo"
    replace=".bar"
    result=${str//$find/$replace}
    echo $result    
    # result is: someFileName.sally because ".foo" was not found
    
        4
  •  12
  •   Nicolae Iotu    6 年前

    找到一个 graceful solution .

    echo ${LINE//12345678/$replace}
    
        5
  •  8
  •   Dave    13 年前

    单引号非常有力。一旦进入,在您离开之前,您无法调用变量替换。请改用双引号:

    echo $LINE | sed -e "s/12345678/$replace/g"
    
        6
  •  4
  •   akira    14 年前
    echo $LINE | sed -e 's/12345678/'$replace'/g'
    

        7
  •  2
  •   Matthieu Moy    9 年前

    sed -i "s#12345678#$replace#g" file.txt
    

    如果 $replace 包含特殊 sed 人物( # \ ). 但你可以进行预处理 引用它们:

    replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
    sed -i "s#12345678#$replace_quoted#g" file.txt
    
        8
  •  0
  •   Richard Salt    4 年前

    我有一个类似的要求,但我的替代变量包含一个符号。像这样逃离符号解决了我的问题:

    replace="salt & pepper"
    echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"
    
        9
  •  0
  •   chandra shekar    4 年前

    与问题无关,但如果有人传递字符串作为 bash脚本的参数

    用途:

    ./bash_script.sh "path\to\file"
    

    而不是:

    ./bash_script.sh path\to\file
    

    reference .

        10
  •  -1
  •   Tunde Pizzle    7 年前

    改用这个

    echo $LINE | sed -e 's/12345678/$replace/g'
    

        11
  •  -2
  •   Prasad Khode    8 年前

    我更喜欢使用双引号,因为单引号是非常强大的,因为我们使用他们如果不能改变任何东西里面,或可以调用变量取代。

    所以使用双引号。

    echo $LINE | sed -e "s/12345678/$replace/g"