LINUX.ORG.RU

shell sed запись в groovy

 


0

1

И снова всем привет, пишу на груви пару строк на shell (sed) замены подстроки, но вот дичь, груви не нравится экранирование ('\'), есть ли какие идеи по устронению этой проблемы? Спасибо.

sh "sed -i 's/xxx.root.dir=/xxx.root.dir=${env.WORKSPACE}/\stage2/\/g' temp.cfg"

Мне кажется, сед без груви это тоже не поймет, у тебя вот тут фигня ${env.WORKSPACE}/\stage2. Чтобы меньше экранировать, используй | в качестве разделителя вместо /.

Deleted
()
Ответ на: комментарий от Deleted

Вариант

Что-то типо этого?

sh "sed -i 's|xxx.root.dir=|xxx.root.dir="${env.WORKSPACE}"/stage2/|g' temp.cfg"
lagmac
() автор топика

должно сработать \\ - тогда груви сохранит один \ для седа

но лучше, как написали выше использовать в седе другой разделитель

ЗЫ странная последовательность слешей в команде '/\/', возможно имелось в виду '\//'? Иначе получается, что экранирован разделитель, а не символ строки

CaHbl4
()
Ответ на: Итогово от lagmac

Нет, фигня, выше правильнее было. Или у тебя там виндовые пути?
Возьми да проверь - если работает как надо, значит верно.

Deleted
()
Ответ на: Итогово от lagmac

нет 1. экранирование '\' ставится перед экранируемым символом (т.е. если нужно экранировать '/', то ставится '\/', а не '/\' как у тебя было изначально

2. зачем вообще нужно экранировать '/' в седе? это нужно, потому что обычно '/' используется как разделитель (delimeter) в команде

Но никто не мешает использовать в качестве разделителя любой другой символ, например '|' '_' или вообще букву (просто его также придется экранировать, если он встречается внутри строк)

вариант

sh "sed -i 's|xxx.root.dir=|xxx.root.dir="${env.WORKSPACE}"/stage2/|g' temp.cfg"
будет наиболее универсальным

но в случае груви (для которого эта команда в целом является просто строкой в тройных кавычках) прокатит вариант с двойным экранированием отдельных символов

sh "sed -i 's/xxx.root.dir=\\/xxx.root.dir="${env.WORKSPACE}"\\/stage2\\//g' temp.cfg"

тут '\\' будет передан седу как '\'

CaHbl4
()
Ответ на: комментарий от CaHbl4

плюс в общем случае регулярное выражение xxx.root.dir найдет не только сроку 'xxx.root.dir'

На месте точек найдется любой символ, так что лучше точки отдельно экранировать

Хотя, если в реальной задаче такого не предвидится, можно забить

CaHbl4
()
Ответ на: комментарий от CaHbl4

У вас двойные кавычки получились вложенные, потому если переменная имеет пробельные символы получите минимум два аргумента.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.