Как я могу заменить текст во всех файлах во всех подпапках, когда мой поиск включает "*", например, у меня есть много текстовых файлов, содержащих такой шаблон (некоторые неправильные пути, которые я хочу исправить),
/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"
но затем как я могу заменить его при хранении содержания тех "*"
Должно быть довольно простым с 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
Используя 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
Тогда мы распечатали значения переменных в указанном шаблоне, поместив /
между ними.