Заменить подстроку в сценарии оболочки - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть строка "st xxx street st st", и я хочу изменить ее на "street xxx street street street". Я могу заменить середину, но как я могу заменить других. Вот мой код:

#!/bin/bash

SPACE=" "
input="st xxx street st st"
search_string="st"
replace_string="street"
output=${input//$SPACE$search_string$SPACE/$SPACE$replace_string$SPACE}

Ответы [ 4 ]

3 голосов
/ 27 февраля 2020

Попробуйте использовать sed, если это возможно:

echo "$input" | sed 's/\bst\b/street/g'

\b в GNU sed относится к границам слов.

Также см .: Как я могу найти и заменить только если совпадение образует целое слово?

2 голосов
/ 27 февраля 2020

Я предполагаю, что никогда не бывает вхождений street в начале или конце строки.

Я предлагаю вам попробовать это:

  1. Сделать все street вхождений в st:

    output=${input//$SPACE$replace_string$SPACE/$SPACE$search_string$SPACE}
    
  2. Теперь вы можете смело менять st на street без пробелов:

    output2=${output//$search_string/$replace_string}
    
0 голосов
/ 27 февраля 2020

Я попробовал «простую глупую» процедуру, в которой я сначала заменяю все пробелы на новые строки, затем ищу (временные) строки, содержащие просто «st», которые я изменяю на улицу, и я возвращаю новые строки обратно в конец.

input='anst xxx street st st'
echo "$input" | sed 's/ /\n/g' | sed 's/^st$/street/g' | tr '\n' ' ' | sed 's/ $/\n/'

вывод:

anst xxx street street street

Слова, содержащие только st, не должны заменяться.

0 голосов
/ 27 февраля 2020

Добавьте эти два

output=${output//$search_string$SPACE/$replace_string$SPACE}
output=${output//$SPACE$search_string/$SPACE$replace_string}

Обновите комментарий, затем с помощью |

output="|${input//$SPACE$search_string$SPACE/$SPACE$replace_string$SPACE}|"
output=${output//"|$search_string$SPACE"/$replace_string$SPACE}
output=${output//"$SPACE$search_string|"/$SPACE$replace_string}
output=${output//|}

Или, как предложил Марканте Макреле

output=${input//$replace_string/$search_string}
output=${output//$search_string/$replace_string}

Но лучше использовать sed.

...