Пакетный файл с использованием sed в Windows — неожиданное добавление вместо замены

#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"