シェル関数でsedに変数リストを渡す方法

シェル関数でsedに変数リストを渡す方法

特定の文字列を含む行の末尾に複数の変数を追加したいと思います。これは私の機能です。

function () { sudo sed -i '/^STRING/ s/$/ '$@'/' FILE; }

しかし、私は得たsed: -e expression #1, char 24: unterminated `s' command

この関数のすべての引数をsedにどのように渡すことができますか?

例:

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

sometext
sometext STRING sometext
sometext

コマンドを実行した後、function test1 test2ファイルは次のように変更する必要があります。

sometext
sometext STRING sometext test1 test2
sometext

ベストアンサー1

「マルチ変数」を添付していません。文字列を追加しています。関数への最も簡単なインタフェースは、単一の文字列を引数として使用して関数を呼び出すことです。

myfunction 'test1 test2'

then (function一部のシェルではキーワードなので、関数名として使用されません)

myfunction () {
  sudo sed -i "/^STRING/ s/\$/ $1/" FILE
}

パラメータはsedスクリプトに挿入されるため、実際には指定された文字列は追加されません。パラメータまたはパラメータは/文字通り解釈されません。\まず、引数を準備してこの問題を解決できます。

myfunction () {
  extra=$(printf '%s\n' "$1" | sed 's![\\/]!\\&!g')
  sudo sed -i "/^STRING/ s/\$/ $extra/" FILE
}

あるいは、Perlなどの他のツールを使用することもできます。

myfunction () {
  sudo env extra="$1" perl -i -pe '/^STRING/ s/$/\Q$ENV{extra}/' FILE
}

関数が一連の文字列を引数として使用し、間にスペースを入れて順番に追加するようにするには、を使用できます"$*"。これは、関数のすべての引数とThereの間の引数を含む単語に拡張されます。の間にスペースがあります。

myfunction () {
  extra=$(printf '%s\n' "$*" | sed 's![\\/]!\\&!g')
  sudo sed -i "/^STRING/ s/\$/ $extra/" FILE
}

おすすめ記事