#batch-file #sed #gnuwin32
#пакетный файл #sed #gnuwin32
Вопрос:
Мне было поручено перенести группу пакетных сценариев в Windows 7 (с XP), и у меня было несколько проблем с использованием sed для замены. Для чего мне нужна строка, так это найти путь к журналу, и все, что находится внутри двойных кавычек, должно быть заменено на ABC (просто для тестирования — на самом деле это будет путь UNC).
Однако вместо этого я получаю две странные проблемы:
- это удаление первой двойной кавычки
- что еще более важно, на самом деле он ничего не заменяет внутри кавычек, а просто добавляет к этой строке
Вот соответствующая строка скрипта:
sed \fs-bri-0197329732.hfls -i -e s,LogPath="*.",LogPath="ABC",g
Этот скрипт работает в Windows XP, но не в Windows 7.
Комментарии:
1. вы уверены в
*.
части? Не так ли.*
?
Ответ №1:
Возможно, проблема связана с UNC-путем:
pushd \fs-bri-019732
sed 9732.fls -i -e s,LogPath="*.",LogPath="ABC",g
popd
Но, возможно, проблема связана с символами кавычек и тем, как sed получает свой массив argv. Затем вы можете попробовать:
sed -i -e "s/LogPath=".*"/LogPath="ABC"/g" \fs-bri-0197329732.hfls
Комментарии:
1. Я бы не ожидал, что это будет путь UNC из-за того, что скрипт фактически редактирует файл не так, как я хочу. Кавычки являются стандартной частью регулярных выражений, которые используются для поиска чего-либо внутри кавычек, поэтому не думаю, что это будет так, но не могу быть уверен. Ну, я бы попытался использовать файл сценария sed, если бы знал, какое это расширение: D. Но на самом деле я пытаюсь избежать этого в отдельном файле, поскольку этот скрипт уже имеет 5/6 файлов сценариев, связанных с ним.
2. Ahhh escape-символы, вот чего мне не хватало: P. Lol mind u не совсем работает, вместо этого он заменяет то, что находится внутри двойных кавычек, но также удаляет все остальное из строки: P. Это я или это немного зацикливается?
3. @user914244: sed является жадным. Так
.*"
будет соответствовать всему до ПОСЛЕДНЕЙ двойной кавычки. Если вы хотите не жадное сопоставление, используйте, например, Perl:perl -pe "s/LogPath=".*?"/LogPath="ABC"/g;"
4. Я никак не могу сделать не жадный в пакетном скрипте?
5. Хорошо продумал, как обойти публикацию ниже для тех, кто застрял в такой же ситуации. sed \ fs-bri-019732 9732.hfls -i -e «s / LogPath= «[:A-Z0-9a-z_\/. ]*»/ Лог-путь=»ABC»/g»
Ответ №2:
Хорошо продумал, как обойти публикацию ниже для тех, кто застрял в такой же ситуации.
sed \fs-bri-0197329732.hfls -i -e "s/LogPath="[:A-Z0-9a-z_\/. ]*"/LogPath="ABC"/g"