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

Ama*_*rsh 259 string bash

我有一个字符串

__PRE__

我想替换所有echo "$string" | tr 'x' '_' | tr 'y' '_'echo "$string" | tr 'x' '_' | tr 'y' '_'echo "$string" | tr 'x' '_' | tr 'y' '_',echo "$string" | tr 'x' '_' | tr 'y' '_'以便输出

__PRE__

怎么做?

我知道一系列的

__PRE__

会工作,但我想一气呵成,不使用烟斗.

编辑:以下工作

__PRE__

jka*_*cki 299

echo "$string" | tr xyz _
Run Code Online (Sandbox Code Playgroud)

将取代的每次出现x,yz_,给A__BC___DEF__LMN你的例子.

echo "$string" | sed -r 's/[xyz]+/_/g'
Run Code Online (Sandbox Code Playgroud)

将取代的重复出现x,yz与单_,让A_BC_DEF_LMN您的例子.

  • 在Mac上,我得到以下内容:sed:非法选项 - r用法:sed脚本[-Ealn] [-i extension] [file ...] sed [-Ealn] [-i extension] [-e script]. .. [ - f script_file] ... [文件...] (17认同)
  • 在*BSD(以及OSX)上,`sed -E`在许多Linux发行版上(基本上)等同于`sed -r`,如果使用`sed's/[xyz] [xyz]*/_/g '`你不需要这个选项.当然,这相当于`tr -s xyz _`所以这里不需要`sed`. (5认同)
  • @halakala Mac发布的sed略有不同.看到这个问题:http://unix.stackexchange.com/questions/13711/differences-between-sed-on-mac-osx-and-other-standard-sed而不是你可以用Homebrew包经理安装"gnu-sed"然后使用`gsed`二进制文件:`$ brew install gnu-sed`然后`$ gsed -r's/[xyz] +/_/g'` (2认同)

Mat*_*hen 268

使用Bash参数扩展:

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
Run Code Online (Sandbox Code Playgroud)

  • 糟糕的替代 (7认同)
  • @Alexey,我的例子对我有用(bash 4.3.11(1)-release)。确保您使用的是`bash`。其他 shell 可能不起作用(尽管有些会)。 (2认同)
  • @RyanG sed 接受任何字符作为“s”的分隔符。由于您正在处理通常包含许多“/”的路径,因此执行“sed 's#/some/path#/some/other/path#”可能比执行大量操作更容易(并且更具可读性)逃跑 (2认同)

Dyl*_*els 96

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

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

一般来说,

要用$ replacement替换$ substring的第一个匹配:

${string/substring/replacement}
Run Code Online (Sandbox Code Playgroud)

要用$ replacement替换$ substring的所有匹配项:

${string//substring/replacement}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,这适用于名为$ string的变量.

  • 请注意,这适用于名为"string"的**变量**不在文字字符串上. (14认同)
  • 最有帮助的,因为它包含参考。 (4认同)

小智 7

read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter
Run Code Online (Sandbox Code Playgroud)

^根据需要使用尽可能多的这些,并且您可以进行自己的BASIC加密


Ben*_* W. 5

这是一个shell参数扩展的解决方案,用一个替换多个连续的出现_:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN
Run Code Online (Sandbox Code Playgroud)

请注意,该模式需要扩展模式匹配,并启用+(pattern)

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

或者,使用-s("挤压")选项tr:

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
Run Code Online (Sandbox Code Playgroud)