Замена некоторых символов в строке другим символом
У меня есть строка типа 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
в вашем примере.
Ответ 2
Использование Bash Расширение параметров:
orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
Ответ 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