使用sed重写文件行

时间:2012-11-21 20:06:38

标签: bash shell sed

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

文件中的行看起来像:

checkedpaths=${myapp.base}/lib

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

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

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

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

4 个答案:

答案 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