如何在 shell 函数中将变量列表传递给 sed

如何在 shell 函数中将变量列表传递给 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'

然后(不用function作函数名称,因为它是某些 shell 中的关键字)

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

请注意,这实际上并没有附加指定的字符串,因为参数被插入到 sed 脚本中。参数中的任何/or都不按字面解释。\您可以通过首先准备论证来解决这个问题:

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
}

如果您绝对希望您的函数采用一系列字符串作为参数,并按顺序将它们全部附加,中间有一个空格,那么您可以使用"$*".这会扩展为一个单词,其中包含函数的所有参数,且参数之间有一个空格。

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

相关内容