用bash变量替换sed

时间:2011-10-06 21:11:51

标签: bash sed substitution

尝试使用带有

行的bash脚本中的sed更改文本文件中的值
sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp

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

5 个答案:

答案 0 :(得分:63)

{b}中的'内的变量不会被取代。要获取字符串替换(或插值,如果您熟悉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


进一步阅读:

答案 1 :(得分:13)

单引号内的变量未扩展,在双引号内,在这种情况下使用双引号。

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

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

答案 2 :(得分:5)

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

这会有用吗?

答案 3 :(得分:1)

您可以使用以下变量。就像这里一样,我想替换hostname即文件中的系统变量。我正在寻找字符串look.me并用look.me=<system_name>

替换整行
sed -i "s/.*look.me.*/look.me=`hostname`/"

您还可以将系统值存储在其他变量中,并可以使用该变量进行替换。

host_var=`hostname`

sed -i "s/.*look.me.*/look.me=$host_var/"

输入文件:

look.me=demonic

文件输出(假设我的系统名称为prod-cfm-frontend-1-usa-central-1):

look.me=prod-cfm-frontend-1-usa-central-1

答案 4 :(得分:1)

我需要在 github 操作中输入我发布的 github 标签。以便在发布时它会自动打包并将代码推送到 artifactory。

这是我如何做到的。 :)

  - 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

回想起来,我希望我在 python 中通过测试做到了这一点。然而,做一些 bash 很有趣。