2012-03-18 3 views
2

У меня есть файл и вы хотите заменить шаблон другой строкой.Использование 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-[^-]*-[^-]/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 

Пожалуйста, обратите внимание, дополнительный '0' символ после "size10". Как вы можете видеть, в команде SED размер равен 10, однако выходной файл «size100»

В чем проблема и как я могу это исправить?

ответ

3

Неправильное выражение в вашем регулярном выражении. У вас есть [^-], который будет соответствовать только 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

вы можете объяснить, что делает '[^ \.] *' Значит и в чем разница с '[^ -] * '?? – mahmood

+0

Да, конечно. '[^ \.] *' означает 0 или более символов до тех пор, пока точка '.' не будет найдена, тогда как' [^ \ -] * 'означает 0 или более символов, пока не будет найден дефис' -'. Поскольку в вашем исходном тексте у вас есть только 1 дефис после 'M1-', поэтому я использовал '[^ -] * - [^ \.] *' Для соответствия '-plt2-size15', который находится непосредственно перед точкой' .'. – anubhava

+0

ok Спасибо, я получил его – mahmood

Смежные вопросы