Усовершенствованная текстовая замена

Как я могу заменить текст во всех файлах во всех подпапках, когда мой поиск включает "*", например, у меня есть много текстовых файлов, содержащих такой шаблон (некоторые неправильные пути, которые я хочу исправить),

/folder1/(abc)/params.launch
/folder2/(efd)/gui.launch
/folder3/(ghi)/robot.launch

Теперь я хочу добавить запуск / перед каждым файлом, чтобы иметь такой результат

/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

Я думал о поиске строкового шаблона

")/*.launch"

но затем как я могу заменить его при хранении содержания тех "*"

2
задан 7 May 2015 в 15:33

2 ответа

Должно быть довольно простым с sed:

sed 's;\([^/]*.launch$\);launch/\1;'
  • Можно сгруппировать подобранный текст путем окружения выражения в скобках (\( ... \)). Необходимо выйти из круглых скобок для создания sed посмотрите их как специальный синтаксис.
  • Группы могут быть отнесены в использование положения - первая группа \1, второе \2, и т.д.

Пример произвел:

$ sed 's;\([^/]*.launch\);launch/\1;' foo   
/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

Это для Основных Регулярных выражений. Для Расширенных регулярных выражений можно использовать sed -r, в этом случае круглых скобок нельзя оставить:

sed -r 's;([^/]*.launch);launch/\1;'

Наконец, в sed, и некоторые другие инструменты, полный подобранный текст может быть отнесен в использование &, предотвращение потребности в группах и обратных ссылках в целом:

sed 's;[^/]*.launch;launch/&;' foo
2
ответ дан 2 December 2019 в 03:54

Используя bash:

#!/bin/bash
while IFS= read -r line; do
  ini="${line%/*}"
  last="${line##*/}"
  repl="${line##*.}"
      echo "${ini}/${repl}/${last}"
done <file.txt

Вывод:

/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

Здесь мы использовали замена параметра из bash для имения трех переменных:

  • ini переменная будет содержать часть прежде в последний раз /, например, /folder1/(abc)

  • last, переменная будет содержать часть после в последний раз /, например, params.launch

  • repl, переменная будет содержать, что быть помещенной в ini и last переменные, т.е. launch

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

0
ответ дан 2 December 2019 в 03:54

Другие вопросы по тегам:

Похожие вопросы: