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

Vij*_*jay 81 unix shell sed

我使用下面的代码替换shell脚本中的字符串.

echo $LINE | sed -e 's/12345678/"$replace"/g'
Run Code Online (Sandbox Code Playgroud)

但它正在被替换$replace而不是该变量的值.

谁有人说出了什么问题?

pax*_*blo 127

如果要解释$replace,则不应使用单引号,因为它们会阻止变量替换.

尝试:

echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
Run Code Online (Sandbox Code Playgroud)

假设你想要输入报价.如果你想要报价,请使用:

echo $LINE | sed -e "s/12345678/${replace}/g"
Run Code Online (Sandbox Code Playgroud)

成绩单:

pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _
Run Code Online (Sandbox Code Playgroud)

请注意确保${replace}没有任何重要的字符sed(/例如),因为除非转义,否则会引起混淆.但是,正如你所说,如果你用一个数字替换另一个数字,这应该不是问题.

  • `export`不是必需的. (4认同)

gho*_*g74 67

你可以使用shell(bash/ksh).

$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这也在dash上失败,在许多现代Linux上都是`/ bin/sh`. (5认同)
  • 可能想提一下bash特有的(和ksh?).对大多数人来说可能不是重要的,但我们中的一些人仍被迫在古老的UNIXen上工作:-) (3认同)

bob*_*bob 19

这个问题并不是特定的,但是对于那些需要扩展相同功能的人来说,以前的答案是清晰的:

# 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
Run Code Online (Sandbox Code Playgroud)


Md.*_*sen 9

让我举两个例子。

  • 使用 sed:
#!/bin/bash
LINE="12345678HI"
replace="Hello"
echo $LINE | sed -e "s/12345678/$replace/g"
Run Code Online (Sandbox Code Playgroud)
  • 不使用 sed:
LINE="12345678HI"
str_to_replace="12345678"
replace_str="Hello"
result=${str//$str_to_replace/$replace_str}
echo $result
Run Code Online (Sandbox Code Playgroud)

希望您会发现它有帮助!


Dav*_*ave 7

单引号非常强大.进入内部后,在离开之前,您无法调用变量替换.改为使用双引号:

echo $LINE | sed -e "s/12345678/$replace/g"
Run Code Online (Sandbox Code Playgroud)


小智 7

找到了一个优雅的解决方案

echo ${LINE//12345678/$replace}
Run Code Online (Sandbox Code Playgroud)


aki*_*ira 5

echo $LINE | sed -e 's/12345678/'$replace'/g'
Run Code Online (Sandbox Code Playgroud)

您仍然可以使用单引号,但是当您希望变量在正确的位置展开时,您必须“打开”它们。否则字符串是“字面上的”(正如@paxdiablo 正确说明的那样,他的答案也是正确的)