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

Vim не имеет опции эмулировать регулярные выражения awk-стиля, нет. Существует много диалектов regex, и к сожалению всегда существуют эти небольшие диалектические различия для отслеживания при движении от одного инструмента до другого.

4
22.08.2011, 14:19
2 ответа

Попробуйте это:

newname=`echo "$filename" | sed -e 's/\(S[0-9][0-9]E[0-9][0-9]\).*\.mp4/\1.mp4/'`

Регулярное выражение:

  • запустите группу (\()
  • соответствуйте SXXEXX, где X цифра между 0 и 9
  • группа конца (\))
  • соответствуйте любому количеству любого символа (кроме новой строки)
  • соответствуйте явной строке (.mp4)

В выражении замены:

  • замена строкой, подобранной в первой группе (\1)
  • замена явной строкой (.mp4)
5
27.01.2020, 20:49
  • 1
    Спасибо. Это работало отлично. Огромное спасибо. Я знал, что команда sed будет ключом, но я просто не мог понять, как использовать его, несмотря на чтение нескольких руководств 'новичков' по sed. Еще раз спасибо. 'Действительно ли S' и 'E' чувствительны к регистру? Если так, как я позволил бы этому соответствовать или верхнему регистру или нижнему регистру - например, Ss или Ee? спасибо –  Stu 22.08.2011, 15:43
  • 2
    @Stu, использовать \([sS][0-9][0-9][eE][0-9][0-9]\) –  glenn jackman 22.08.2011, 17:02

Предположим, у Вас есть список имен файлов с путями в file-list файл, попробуйте следующее

while IFS= read -r path; do
  newpath=$(printf '%s\n' "$path" |
    sed 's/\(.*S[0-9]*E[0-9]*\.\).*\.\([^.]*\)$/\1\2/')
  echo mv -- "$path" "$newpath"
done <file-list

Значение sed используемое регулярное выражение, также по сравнению с примером вводится "The.Big.Bang.Theory.S01E01.xxxxxxxxxxx.mp4"

\(                               start of group 1
.*        The.Big.Bang.Theory.   any sequence of characters
S[0-9]*   S01                    a capital S followed by 0 or more digits
E[0-9]*   E01                    a capital E followed by 0 or more digits
\.        .                      a dot
\)                               end of group 1
.*        xxxxxxxxxxx            any sequence of characters
\.        .                      a dot
\(                               start of group 2
[^.]*     mp4                    a sequence of 0 or more non-dot characters
\)                               end of group 2
$                                end of line

В выводе, строке \1\2 означает "вывод group1 сопровождаемый group2 (так для удаления xxxxxxxxxxx.)

Удалите echo если удовлетворено.

4
27.01.2020, 20:49
  • 1
    . Я попробовал предложение Arcege, потому что я видел его сначала, но я думаю, что это работало бы точно также. Большое спасибо за Ваш быстрый ответ. Я действительно ценю. –  Stu 22.08.2011, 15:44
  • 2
    @stu: можно использовать S[0-9]{2}E[0-9]{2} вместо S[0-9]*E[0-9]* если Вы хотите соответствовать точно 2 цифрам после S и E. –  Peter.O 22.08.2011, 15:49

Теги

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