我有一个像 AxxBCyyyDEFzzLMN 这样的字符串,我想替换所有出现的 x , y 和 z with _ 。
我怎样才能做到这一点?
我知道echo "$string" | tr 'x' '_' | tr 'y' '_'
可行,但我想一次性完成,不使用管道。
答案 0 :(得分:274)
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
。
答案 1 :(得分:249)
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