我希望能够确保配置文件的一行包含附加的路径。
文件中的行如下所示:
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