用bash变量替换sed

cst*_*sta 52 bash sed substitution

尝试使用带有该行的bash脚本中的sed更改文本文件中的值,

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp
Run Code Online (Sandbox Code Playgroud)

这将是一个for循环.不知道为什么它不起作用.有什么建议?

k.p*_*ell 70

里面的变量'不会被bash取代.要获取字符串替换(或插值,如果您熟悉perl),则需要将其更改为使用双引号"而不是单引号:

$ # enclose entire expression in double quotes
$ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

$ # or, concatenate strings with only variables inside double quotes
$ # this would restrict expansion to relevant portion
$ # and prevent accidental expansion for !, backticks, etc
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp

$ # variable cannot contain arbitrary characters
$ # see link in further reading section for details
$ a='foo 
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command
Run Code Online (Sandbox Code Playgroud)


进一步阅读:

  • 也许还提到如果变量包含斜杠,则需要使用不在字符串中出现的不同分隔符(或者每次出现分隔符时使用反斜杠转义).斜杠是`s`的常见默认值,但您可以使用任何标点符号; `sed's%draw($ prev_number; n _)%draw($ number; n _)%g"file.txt`或`s#from#to#g`或`s_from_to_g`等. (7认同)

Pau*_*sey 13

单引号内的变量不会扩展,在双引号内,在这种情况下使用双引号.

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
Run Code Online (Sandbox Code Playgroud)

你也可以使它eval,但不要这样做!


Ken*_*ent 5

sed "s/draw($prev_number;n_)/draw($number;n_)/g" 
Run Code Online (Sandbox Code Playgroud)

这会有用吗?