Como passar uma lista de variáveis para sed em uma função shell

2

Eu quero acrescentar várias variáveis ao final de uma linha que contém uma certa string. Aqui está minha função:

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

No entanto, tenho sed: -e expression #1, char 24: unterminated 's' command

Como posso passar todos os argumentos desta função para sed?

Exemplo:

O arquivo é como:

sometext
sometext STRING sometext
sometext

Depois de executar o comando function test1 test2 , o arquivo deve ser alterado para

sometext
sometext STRING sometext test1 test2
sometext
    
por roymaztang 30.01.2017 / 21:24

1 resposta

1

Você não está anexando "várias variáveis". Você está anexando uma string. A interface mais direta para a sua função seria chamá-la com uma única string como argumento:

myfunction 'test1 test2'

e depois (não usando function como o nome da função porque é uma palavra-chave em alguns shells)

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

Tenha em atenção que isto não acrescenta realmente a cadeia especificada, porque o argumento é interpolado no script sed. Qualquer / ou \ no argumento não é interpretado literalmente. Você pode contornar isso primeiro preparando o argumento:

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

Como alternativa, você pode usar outra ferramenta, como perl:

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

Se você quer absolutamente que sua função tome uma série de strings como argumentos, e anexe-os todos em ordem com um espaço entre eles, então você pode usar "$*" . Isso se expande para uma única palavra contendo todos os argumentos da função com um espaço intermediário.

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