1

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

文件中的行如下所示:

checkedpaths=${myapp.base}/lib

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

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

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

我试图使用标准的 shell 脚本命令来做到这一点。我认为使用 sed 可以更紧凑地完成它。

4

4 回答 4

2

你应该能够做到:

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

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

于 2012-11-21T20:13:23.093 回答
2
awk '{print $0 (/\$\{myapp\.base\}\/bin(,|$)/ ? "" : "${myapp.base}/bin")}' file
于 2012-11-21T21:01:15.397 回答
0

不使用sedbut only bash,您可以使用:

if [[ $myvar != *tobeappended* ]]
then
    myvar=$myvar,tobeappended
fi
于 2012-11-21T20:13:48.277 回答
0

您可以使用以下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_fileinput_file用作输入;将输出重定向到output_file
于 2012-11-21T20:29:31.343 回答