我希望能够确保配置文件的一行包含附加路径。
文件中的行看起来像:
checkedpaths=${myapp.base}/lib
如果该行没有$ {myapp.base} / bin,我想将该行附加到以下内容:
checkedpaths=${myapp.base}/lib,${myapp.base}/bin
线路上可能有任意数量的其他路径 $ {myapp.base}已在文件中定义,无需担心扩展到的内容。
我试图使用标准shell脚本命令来执行此操作。 我认为我可以更紧凑地做到这一点。
答案 0 :(得分:2)
你应该可以这样做:
sed '/checkedpaths/{ \@${myapp.base}/bin@!s@$@,${myapp.base}/bin@ }'
这不会替换文件的内容:重定向或使用-i
。此外,这不是特别强大,并且无法将文本附加到包含${myapp.base}/binary
的行,但如果这是一个问题,则很容易修复。
答案 1 :(得分:2)
awk '{print $0 (/\$\{myapp\.base\}\/bin(,|$)/ ? "" : "${myapp.base}/bin")}' file
答案 2 :(得分:0)
不使用sed
而只使用bash
,您可以使用:
if [[ $myvar != *tobeappended* ]]
then
myvar=$myvar,tobeappended
fi
答案 3 :(得分: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 ""}
:现在使用换行符char终止当前行,无论模式是否匹配。input_file > output_file
:使用input_file
作为输入;将输出重定向到output_file