A correspondência exata de palavras em sed
é complicada, especialmente se você quiser escrever uma solução portátil ou se a sua definição de "palavra" contiver caracteres especiais diferentes de _
(como na sua situação). A melhor maneira que encontrei para fazer isso é considerar todos os 4 casos em que uma palavra pode aparecer em uma linha de entrada:
- No começo
- No final
- No começo e no final (ocupando toda a linha)
- No meio, em algum lugar
Se a sua definição de palavra for simplesmente uma sequência de caracteres que não sejam espaços em branco, a solução a seguir deverá funcionar para você (testada):
_s='[ ]' # contains a space and a literal tab character (CTRL-V + TAB)
input_string='echo "$input_string" | sed \
-e "s|^$search_string\($_s\)|\1|g" \
-e "s|\($_s\)$search_string$|\1|g" \
-e "s|^$search_string$||g" \
-e "s|\($_s\)$search_string\($_s\)|\1\2|g"'
Observe que escolhi |
como o delimitador em vez de #
. Isso ocorre porque #
pode aparecer em nomes de arquivos (por exemplo, Os arquivos de salvamento automático do Emacs ) enquanto |
é reservado, pelo menos no Linux. Observe também que a saída conterá os caracteres do espaço em branco em torno de cada instância de $search_string
. Se você preferir omitir o espaço em branco, poderá usá-lo (testado):
_s='[ ]' # contains a space and a literal tab character (CTRL-V + TAB)
input_string='echo "$input_string" | sed \
-e "s|^$_s*$search_string$_s\{1,\}||g" \
-e "s|$_s\{1,\}$search_string$_s*$||g" \
-e "s|^$search_string$||g" \
-e "s|\($_s\)$search_string$_s\{1,\}|\1|g"'
Essa última expressão parece um pouco diferente, e por um bom motivo - você não deseja remover o espaço em branco de ambos os lados de $search_string
uma vez que você chegou tão longe no processamento da linha de entrada, porque, ao fazer isso, você removeria o espaço em branco entre palavras não correspondidas em ambos os lados de $search_string
, o que as transformaria em conjunto.
Notas finais:
- Você pode conseguir omitir alguns dos modificadores
g
em
as expressões sed
, mas não faz mal deixá-las entrar.
- Provavelmente é desnecessário dizer, mas se o seu
$search_string
for um caminho,
não pode conter nenhum espaço.