使用 sed 重写文件行



我希望能够确保配置文件的一行包含附加的路径。

文件中的行如下所示:

checkedpaths=${myapp.base}/lib

如果它没有 ${myapp.base}/bin,我想将该行附加到类似以下内容:

checkedpaths=${myapp.base}/lib,${myapp.base}/bin

该行上可能还有任意数量的其他路径。
${myapp.base} 已经在文件中定义,无需担心它扩展到什么。

我试图使用标准的 shell 脚本命令来执行此操作。我认为使用 sed 我可能能够更紧凑地做到这一点。

你应该能够做到:

sed '/checkedpaths/{ @${myapp.base}/bin@!s@$@,${myapp.base}/bin@ }'

这不会替换文件的内容:重定向或使用-i 。 此外,这不是特别健壮,并且无法将文本附加到包含${myapp.base}/binary的行中,但如果这是一个问题,这很容易解决。

awk '{print $0 (/${myapp.base}/bin(,|$)/ ? "" : "${myapp.base}/bin")}' file
您可以使用

awk脚本执行此操作,如下所示:

#!/bin/bash
awk '{printf "%s", $0}
     !/${myapp.base}/bin/ {printf "%s", ",${myapp.base}/bin"}
     {print ""}' input_file > output_file

输入:

checkedpaths=${myapp.base}/lib
checkedpaths=${myapp.base}/bin,someotherstuff

输出:

checkedpaths=${myapp.base}/lib,${myapp.base}/bin
checkedpaths=${myapp.base}/bin,someotherstuff

解释:

  • awk:调用 awk 命令
  • '...':用单引号括起来的所有内容都将由awk运行
  • {printf "%s", $0}:对于每一行,按原样打印,但不以换行符结尾
  • !/${myapp.base}/bin/ {printf ",${myapp.base}/bin"} :如果模式${myapp.base}/bin在当前行的任意位置匹配,则打印,${myapp.base}/bin(因为我们在最后一步中没有用换行符终止该行,这会将其附加到同一行的末尾。
  • {print ""} :现在用换行符终止当前行,无论模式是否匹配。
  • input_file > output_file:使用 input_file 作为输入;将输出重定向到 output_file

不使用sed而只使用bash,你可以使用:

if [[ $myvar != *tobeappended* ]]
then
    myvar=$myvar,tobeappended
fi

相关内容

  • 没有找到相关文章

最新更新