1

構成ファイルの1行に追加のパスが含まれていることを確認できるようにしたいと思います。

ファイルの行は次のようになります。

checkedpaths=${myapp.base}/lib

行に${myapp.base}/ binがない場合は、次のような行を追加します。

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

回線上には他のパスがいくつあってもかまいません。
$ {myapp.base}はすでにファイルで定義されており、何に展開されるかを心配する必要はありません。

私は標準のシェルスクリプトコマンドを使用してこれを行おうとしていました。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

を使用せずにsed、のみ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 に答える