Регулярное выражение заменяет янтарный путь шаблонов на sed

#regex #sed

#регулярное выражение #sed

Вопрос:

Мне нужно заменить все пути for / in в этом формате:

 util.RenderTemplate(w, "auth\profile", c)
util.RenderTemplate(w, "auth\something\extra", c)

 

Путь может иметь не более трех уровней с двумя разделителями,
но я хотел бы написать что-то общее для n уровней, n-1 разделителей.

Я пришел с этим простым запросом sed sed -n -E "s:(util.RenderTemplate(w,. )\(. , c)):1/2:p" file , но это позволило мне

 util.RenderTemplate(w, "auth/profile", c)
util.RenderTemplate(w, "auth\something/extra", c)

 

Таким образом, он работает только с одним 2-уровневым путем и не заменяется должным образом, потому что он оставил из группы захвата.

Я изменил запрос sed следующим образом:

sed -n -E 's:(util.RenderTemplate(w,[^] )\\([^] , c)):1/2:p' file

 util.RenderTemplate(w, "auth/profile", c)
THIS EVEN DID NOT FOUND util.RenderTemplate(w, "auth\something\extra", c)
 

Я близок к решению с отрицающей группой [^], она не содержит дополнительных
из группы захвата, но она не работает, когда в path несколько delimiters …
Может ли кто-нибудь помочь мне с универсальным решением и объяснением?

Я ожидаю найти и заменить даже многоуровневые пути, так что это

 util.RenderTemplate(w, "auth\something\extra", c)
 

заменяет на

 util.RenderTemplate(w, "auth/something/extra", c)
 

Комментарии:

1. Каков ваш ожидаемый результат?

2. Я добавил свое ожидание, нужно заменить все \ на / даже в таких путях, как A \ B \ C \D, а не только с одинарными разделителями A \B

Ответ №1:

Вы можете использовать это sed :

 sed '/util.RenderTemplate/s~\\~/~g' file

util.RenderTemplate(w, "auth/something/extra", c)
 

Это awk также должно работать

 awk -F '\\\\' -v OFS=/ '/util.RenderTemplate/ {$1=$1} 1' file
 

Комментарии:

1. Кажется, это работает, но оно заменяет также path вне util. renderTemplate, это можно исправить, потому что есть только 2 места, но я хотел бы заменить только в util. renderTemplate(w, «A \ B \ C», c), где происходит подстановка в строке «A \ B \ C»

2. Можете ли вы попробовать: sed '/util.RenderTemplate/s~\\~/~g' file

Ответ №2:

С awk помощью функции глобальной подстановки вы также можете попробовать следующее.

 awk '/util.RenderTemplate/{gsub(/\\/,"/")} 1' Input_file
 

Логическое объяснение: использование gsub (глобальной подстановки) для замены \ (где я убегаю , чтобы сделать так, чтобы это было так \ , чтобы оно становилось \\ 2 раза \ , так что awk обрабатывается как буквальный символ) со / всеми его вхождениями. 1 будут напечатаны текущие отредактированные / не отредактированные строки.