Замена некоторых символов в строке другим символом - PullRequest
240 голосов
/ 20 мая 2010

У меня есть строка типа AxxBCyyyDEFzzLMN , и я хочу заменить все вхождения x , y и z на _ .

Как мне этого добиться?

Я знаю, что echo "$string" | tr 'x' '_' | tr 'y' '_' будет работать, но я хочу сделать это за один раз, без использования труб.

Ответы [ 5 ]

277 голосов
/ 20 мая 2010
echo "$string" | tr xyz _

будет заменять каждое вхождение x, y или z на _, давая в вашем примере A__BC___DEF__LMN.

echo "$string" | sed -r 's/[xyz]+/_/g'

заменит повторяющиеся вхождения x, y или z на один _, давая в вашем примере A_BC_DEF_LMN.

251 голосов
/ 20 мая 2010

Использование Расширение параметров Bash :

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
90 голосов
/ 09 декабря 2014

Вы можете найти эту ссылку полезной:

http://tldp.org/LDP/abs/html/string-manipulation.html

В общем

Чтобы заменить первое совпадение $ substring на $ replace:

${string/substring/replacement}

Чтобы заменить все совпадения $ substring на $ replace:

${string//substring/replacement}

EDIT: Обратите внимание, что это относится к переменной с именем $ string.

5 голосов
/ 02 января 2017

Вот решение с расширением параметров оболочки, которое заменяет несколько смежных вхождений одним _:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

Обратите внимание, что шаблон +(<em>pattern</em>) требует расширенного сопоставления с шаблоном, включается с помощью

shopt -s extglob

В качестве альтернативы, с параметром -s ("сжатие") tr:

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
5 голосов
/ 17 января 2014
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^ используйте столько, сколько вам нужно, и вы можете сделать свое собственное шифрование BASIC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...