Regex 使用SED替换模式会导致出现额外的字符

Regex 使用SED替换模式会导致出现额外的字符,regex,bash,sed,Regex,Bash,Sed,我有一个文件,想用另一个字符串替换一个模式 #PBS -N bench1-M1-plt2-size15 #PBS -o /home/results/bench1-M1-plt2-size15.out ./run -d ./results/ --config=bench1-M1-plt2-size15.conf \ --results=bench1-M1-plt2-size15.res config/myConfig.txt -F 2000000 我使用这个命令 sed 's/M1-[^-]

我有一个文件,想用另一个字符串替换一个模式

#PBS -N bench1-M1-plt2-size15
#PBS -o /home/results/bench1-M1-plt2-size15.out
./run -d ./results/ --config=bench1-M1-plt2-size15.conf \ 
--results=bench1-M1-plt2-size15.res config/myConfig.txt -F 2000000 
我使用这个命令

sed 's/M1-[^-]*-[^-]/M1-plt32-size10/g' filename
但是,输出文件如下所示:

#PBS -N M1-plt32-size100
#PBS -o /home/mahmood/gem5/results/M1-plt32-size100.out
./run -d ./results/ --config=bench1-M1-plt32-size100.conf \
--results=bench1-M1-plt32-size100.res config/myConfig.txt -F 2000000 
请注意在“size10”后面加上一个“0”字符。如您所见,在SED命令中,size设置为10,但输出文件为“size100”


问题是什么?我如何解决?您的正则表达式不正确。您的
[^-]
将只匹配1个非连字符。我相信这就是你的意图:

sed 's/M1-[^-]*-[^\.]*/M1-plt32-size10/' filename
输出:

#PBS -N bench1-M1-plt32-size10
#PBS -o /home/results/bench1-M1-plt32-size10.out
./run -d ./results/ --config=bench1-M1-plt32-size10.conf \ 
--results=bench1-M1-plt32-size10.res config/myConfig.txt -F 2000000

你能解释一下
[^\.]*
是什么意思,以及
[^-]*
有什么区别吗?当然可以
[^\.]*
表示在找到点
之前包含0个或多个字符,而
[^\-]*
表示在找到连字符
-
之前包含0个或多个字符。由于在原始文本中,
M1-
之后只有一个连字符,因此我使用了
[^-]*-[^\.]*
来匹配
-plt2-size15
,它正好位于一个点
之前。