用Bash变量进行sed替换

用Bash变量进行sed替换,bash,sed,substitution,Bash,Sed,Substitution,我试图在Bash脚本中使用sed更改文本文件中的值 sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp 这将在for循环中。为什么它不工作?这可能有助于: sed "s/draw($prev_number;n_)/draw($number;n_)/g" 单引号内的变量不会展开,但双引号内的变量会展开。在这种情况下使用双引号 sed "s/draw($prev_number;n_)/draw($number;n

我试图在Bash脚本中使用sed更改文本文件中的值

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp
这将在
for
循环中。为什么它不工作?

这可能有助于:

sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

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

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

您也可以使用
eval
,但不要这样做

Bash中不会替换
中的变量。要获得字符串替换(或插值,如果您熟悉Perl),您需要将其更改为使用双引号
,而不是单引号:

$ # Enclose the 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 the relevant portion
$ # and prevent accidental expansion for !, backticks, etc.
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp

$ # A variable cannot contain arbitrary characters
$ # See link in the further reading section for details
$ a='foo
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command

进一步阅读:

  • *
  • 除非您需要将其放在不同的文件中,否则可以使用

您可以使用下面这样的变量。就像这里,我想替换
主机名
,即文件中的一个系统变量。我正在查找字符串
look.me
,并将整行替换为
look.me=

您还可以将系统值存储在另一个变量中,并可以使用该变量进行替换

host\u var=
`hostname`

sed-i“s/*look.me.*/look.me=$host\u var/”


输入文件:

look.me=demonic
文件输出(假设我的系统名为
prod-cfm-frontend-1-usa-central-1
):


我需要在github操作中输入我的版本中的github标记,这样在发布时它会自动打包并将代码推送到artifactory

以下是我是如何做到这一点的:


回顾过去,我希望我能在python中通过测试做到这一点。不过,做一些bash很有趣。

谢谢你的工作。你介意解释一下你所说的扩展是什么意思吗?我的直觉告诉我,它应该类似于变量替换。还有,为什么不使用eval呢?也许还可以提到,如果变量包含斜杠,你需要使用字符串中未出现的不同分隔符(或每次出现分隔符时都用反斜杠转义)。斜杠是
s
的常见默认值,但您可以使用任何标点字符;
sed“s%draw($prev\u number;n\uu)%draw($number;n\ug)%g“file.txt
s#from#to#g
s#u from#u to#g
等。如果变量包含新行(“\n”)则不起作用,但它曾经转义过(对于我的用例)还斜杠:
changelogEscaped=$(sed-e's%\/%\\/\\/%g;$!a\'$”\n'\\n”
look.me=demonic
look.me=prod-cfm-frontend-1-usa-central-1
  - name: Invoke build
    run: |
      # Gets the Tag number from the release
      TAGNUMBER=$(echo $GITHUB_REF | cut -d / -f 3)
      
      # Setups a string to be used by sed
      FINDANDREPLACE='s/${GITHUBACTIONSTAG}/'$(echo $TAGNUMBER)/
      
      # Updates the setup.cfg file within version number
      sed -i $FINDANDREPLACE setup.cfg
      
      # Installs prerequisites and pushes 
      pip install -r requirements-dev.txt
      invoke build