
特定の文字列を含む行の末尾に複数の変数を追加したいと思います。これは私の機能です。
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
}