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”的变量,而不是文本字符串。最有用的是,因为它包含引用。