String 用另一个字符替换字符串中的某些字符

String 用另一个字符替换字符串中的某些字符,string,bash,String,Bash,我有一个类似于AxxBCyyyDEFzzLMN的字符串,我想用替换所有出现的x、y和z 我怎样才能做到这一点 我知道echo“$string”|tr'x'|tr'y'.可以工作,但我想一次完成,不使用管道。使用: 将x、y或z的每一次出现替换为,在您的示例中给出A_uuubc_uudef_ulmn echo "$string" | sed -r 's/[xyz]+/_/g' read filename ; sed -i 's/letter/newletter/g' "$filename" #l

我有一个类似于
AxxBCyyyDEFzzLMN
的字符串,我想用
替换所有出现的
x
y
z

我怎样才能做到这一点

我知道
echo“$string”|tr'x'|tr'y'.
可以工作,但我想一次完成,不使用管道。

使用:

x
y
z
的每一次出现替换为
,在您的示例中给出
A_uuubc_uudef_ulmn

echo "$string" | sed -r 's/[xyz]+/_/g'
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter
将重复出现的
x
y
z
替换为一个
\uu
,在您的示例中给出
a_BC\u DEF\u LMN

echo "$string" | sed -r 's/[xyz]+/_/g'
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^您可以根据需要使用任意数量的密码,您可以自己进行基本加密

您可能会发现此链接很有用:

总的来说

要将$substring的第一个匹配项替换为$replacement,请执行以下操作:

${string/substring/replacement}
${string//substring/replacement}
要将$substring的所有匹配项替换为$replacement,请执行以下操作:

${string/substring/replacement}
${string//substring/replacement}
编辑:
请注意,这适用于名为$string的变量。

这里是一个具有shell参数扩展的解决方案,它用单个
替换多个连续出现的情况:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN
请注意,
+(pattern)
模式需要扩展模式匹配,并使用

shopt -s extglob
或者,使用
tr的
-s
(“挤压”)选项:

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

$tr-s xyz uu是否要用一个下划线替换任何连续的x、y或z序列,或者是否要用一个下划线替换每个x、y或z序列?还有,混合序列呢,比如
AxyzB
?三个下划线或一个?
tr'[xyz]
也将替换
[
]
。参数应该只是一个字符列表(虽然像
a-z
这样的范围是可以的,在一些实现中,像
[:digit:][/code>)这样的POSIX字符类也可以。在Mac上,我得到了以下结果:sed:invalical option--r用法:sed script[-Ealn][I extension][file…]sed[-Ealn I extension][e script。。。[-f脚本文件]。。。[文件…]我有一个包含
,[]{}()~
字符的字符串。我想用每个用
'\'.
转义的特殊字符替换它。我怎样才能用oneshot完成这个任务?@halakala Mac提供了一个稍微不同的sed版本。查看此问题:您可以使用自制软件包管理器安装“gnu-sed”,然后使用
gsed
二进制:
$brew install gnu-sed
然后
$gsed-r's/[xyz]+/[xyz]+//g'
在*BSD(以及OSX)上,如果您使用
sed's/[xyz],那么
sed-E
在许多Linux发行版上(基本上)等同于
sed-r
[xyz]*/\ug'
你不需要这个选项。当然,这相当于
tr-s xyz
,所以这里不需要
sed
。@inckka你不能用
tr
来解决这个问题。
sed/[[{}(),]/\\&/g'
但是如果你有后续问题,请问一个新问题(当然,请随意链接到这里以供参考)。顺便说一句,
~
不是regex元字符(尽管
~
在某些位置被Bash和其他shell扩展为
$HOME
;但不是
sh
。@Alexey,我的例子对我有用(Bash 4.3.11(1)-release)。请确保您使用的是
bash
。其他shell可能无法工作(尽管某些shell可能无法工作)。谢谢@MatthewFlaschen。这正是我在bash脚本中对绝对路径执行sed替换所需的操作(将/替换为\/以便sed接受它)@RyanG如果bash有内置替换,为什么要使用
sed
?@MestreLion这可能是错误的,但我需要用绝对路径替换一堆文件中的标准变量名,我使用的是sed in place replacement。但是你不能有“/”没有在命令中转义它。我在bash中将操作串在一起。这不是在bash中操作字符串的最佳方式吗?@RyanG sed接受任何字符作为
s
的分隔符。因为您处理的是通常包含许多
/
的路径,所以可能更容易(也更可读)要执行sed的#/some/path#/some/other/path#
而不是执行大量转义请注意,这适用于名为“string”的变量,而不是文本字符串。最有用的是,因为它包含引用。