#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
будут напечатаны текущие отредактированные / не отредактированные строки.