![Изменить [tr][tr]{X} на [tr][tr]{\tinyX} в длинном списке файлов в bash?](https://rvso.com/image/164480/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%5Btr%5D%5Btr%5D%7BX%7D%20%D0%BD%D0%B0%20%5Btr%5D%5Btr%5D%7B%5CtinyX%7D%20%D0%B2%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D0%B2%20bash%3F.png)
Новичок здесь. Я пытаюсь запрограммировать скрипт bash, который заменит для каждого файла в папке следующую последовательность:
[tr][tr]{X}
где X — любое десятичное число (набор цифр и «.») на
[tr][tr]{\tinyX}
.
Есть идеи?
Спасибо
решение1
Если у вас нет доступа к GNU sed
, вы также можете использовать perl
(чей -i
GNU sed
фактически позаимствовал):
find . -type f -exec perl -Tpi -e 's/\Q[tr][tr]{\E\K[\d.]+\}/\\tiny$&/g' {} +
решение2
С помощью GNU, sed
использующего глобальный шаблон замены s/regexp/replacement/g
:
sed -i'' 's/\(\[tr\]\[tr\]{\)\([0-9.]\+}\)/\1\\tiny\2/g' /path/to/folder/*
Это захватывает строку [tr][tr]{
в одной группе и X
содержит по крайней мере одну цифру или .
(выражение в скобках [0-9.]\+
, \+
соответствует символам внутри скобок один или несколько раз), за которым следует закрытие }
во второй группе, и заменяет совпадающие части первой группой \tiny
и второй группой в каждой строке. Скобки ()
для групп, буквальные скобки []
и +
буквальный обратный слеш \
необходимо экранировать еще одним обратным слешем.
Перед запуском обязательно сделайте резервную копию папки с данными (или используйте -i.back
вместо нее , -i''
чтобы сохранить оригиналы как filename.back
).