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.