UNIX изменить все расширение файла для списка файлов - PullRequest
1 голос
/ 10 марта 2020

Я абсолютный новичок в этой области, поэтому извините, если это глупый вопрос.

В моем сценарии оболочки у меня есть переменная с именем FILES, которая содержит путь к файлам журналов, например:

FILES="./First.log ./Second.log logs/Third.log"

и я хочу создать новую переменную с теми же файлами, но с другим расширением, например:

NEW_FILES="./First.txt ./Second.txt logs/Third.txt"

Поэтому я запускаю эту команду:

NEW_FILES=$(echo "$FILES" | tr ".log" ".txt")

Но я получаю следующий вывод:

NEW_FILES="./First.txt ./Secxnd.txt txts/Third.txt"
#                                   ^^^

Я понимаю, что символ . - это специальный символ, но я не знаю, как его избежать. Я уже пытался добавить \ до этого периода, но безрезультатно.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

tr - не тот инструмент, который вам нужен. Цель tr состоит в том, чтобы менять персонажей 1 к 1. Вы, вероятно, не видели его, но Second должно быть изменено на Secxnd.

Я думаю, sed лучше.

NEW_FILES=$(sed 's/\.log/.txt/g' <<< $FILES)

Он ищет \.log обычный выражение и заменяет его строкой .txt. Обратите внимание на \. в регулярном выражении, что означает, что оно соответствует символу точки . и ничего больше.

1 голос
/ 10 марта 2020

tr заменяет символов другими символами. Когда вы пишете tr .log .txt, он заменяет . на ., l на t, o на x и g на t.

Для выполнения строка замену вы можете использовать sed 's/pattern/replacement/g', где s означает заменить и g означает глобально (то есть заменить несколько раз на строку).

NEW_FILES=$(echo "$FILES" | sed 's/\.log/.txt/g')

Эту замену также можно выполнить непосредственно в оболочке без каких-либо внешних инструментов.

NEW_FILES=${FILES//\.log/.txt}

Синтаксис аналогичен sed, глобальная замена обозначена двумя косыми чертами. С одним sla sh будет заменен только первый матч.

...