我想将多个变量附加到包含特定字符串的行的末尾。这是我的功能:
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
}