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

时间:2010-05-20 05:18:39

标签: string bash

我有一个像 AxxBCyyyDEFzzLMN 这样的字符串,我想替换所有出现的 x y z with _

我怎样才能做到这一点?

我知道echo "$string" | tr 'x' '_' | tr 'y' '_'可行,但我想一次性完成,不使用管道。

5 个答案:

答案 0 :(得分:274)

echo "$string" | tr xyz _

会将xyz的每次出现替换为_,并在您的示例中提供A__BC___DEF__LMN

echo "$string" | sed -r 's/[xyz]+/_/g'

会用x替换yz_的重复出现次数,在您的示例中为A_BC_DEF_LMN

答案 1 :(得分:249)

使用Bash Parameter Expansion

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}

答案 2 :(得分:88)

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

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

一般来说,

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

${string/substring/replacement}

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

${string//substring/replacement}

编辑: 请注意,这适用于名为$ string。

的变量

答案 3 :(得分:5)

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

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

答案 4 :(得分:5)

这是一个shell参数扩展的解决方案,用一个@Service("StockistServiceImpl") public class StockistServiceImpl implements StockistService { List<Pair<String, Integer>> charList = new ArrayList<Pair<String, Integer>>(); Map<String,String> mapTxtFile = new HashMap<String, String>(); Properties fileTypeProperties = new Properties(); Properties matchClassNameProperties = new Properties(); try { fileTypeProperties.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("fileTypeProperties.properties")); } catch (IOException e) { //e.printStackTrace(); } try { matchClassNameProperties.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("matchClassNameProperties.properties")); } catch (IOException e) { //e.printStackTrace(); } for (String key : fileTypeProperties.stringPropertyNames()) { String value = fileTypeProperties.getProperty(key); mapTxtFile.put(key, value); if(value.contains(partyCode.trim())){ String className = matchClassNameProperties.getProperty(key); try { Class clazz = Class.forName(className); try { TxtFile objToReadTxtFile = (TxtFile) clazz.newInstance(); charList= objToReadTxtFile.readTxtFile(fileName, codeDetails); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ //read normally else block } } } 替换多个连续的事件:

_

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

打开
+(pattern)

或者,使用shopt -s extglob 的{​​{1}}(“挤压”)选项:

-s