Замена некоторых символов в строке другим символом

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

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

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

Ответ 1

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 в вашем примере.

Ответ 3

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

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

В общем случае

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

${string/substring/replacement}

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

${string//substring/replacement}

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

Ответ 4

read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

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

Ответ 5

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

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

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

shopt -s extglob

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

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN