Как переименовать файлы с помощью sed?

open(1) символьная ссылка на openvt(1), для которого описание, "запускают программу на новом виртуальном терминале". Чтобы сделать это, этому нужен доступ к консольному устройству для открытия виртуального терминала. Это маловероятно программа, которую Вы ищете.

Системы Debian имеют дженерик edit управляйте, чтобы можно было использовать для редактирования файла. Иначе выберите определенного редактора, с которым Вы хотите использовать и вызвать это .bash_profile.

1
13.10.2012, 20:27
3 ответа

Я предполагаю, что Вы хотите переименовать файл, а также переместить его.

Используя мой исходный сценарий как основа, измените эту часть сценария:

if [ "$NumFolders" -eq 1 ] ; then 
  mv "$ParentFolder/$FileToMove" "$TargetFolder/" 
else

к чему-то вроде этого:

if [ "$NumFolders" -eq 1 ] ; then
  NewFileName=$(echo "$FileToMove" | sed -E -e 's/_zz[0-9]+\././')
  mv "$ParentFolder/$FileToMove" "$TargetFolder/$NewFileName" 
else

Переводя regex в подробный английский язык, sed сценарий здесь заменяет "первое вхождение во входной строке '_zz сопровождаемый одной или несколькими цифрами, сопровождаемыми литеральной точкой'" только с точкой.

т.е. как ответ Ben это не сделает правильной вещи с файлом, который имеет два или больше '_zz20...' последовательности в нем. Достаточно легкий заменить его regexp Birei (кроме избавляются от слова 'пустой указатель' между \1 и \2, это заменит его литеральной строкой 'пустой указатель'):

NewFileName=$(echo "$FileToMove" | sed -E -e 's/^(.*)zz[0-9]+(\.pdf)$/\1\2/')

BTW, это, возможно, было сделано с одной строкой и без временной переменной ($NewFileName), но легче понять этот путь.

2
27.01.2020, 23:21
  • 1
    btw, если Вам понравился мой исходный ответ и он работал на Вас, затем Примите его - должна быть галочка под вверх и вниз по кнопкам голосования. –  cas 03.09.2012, 17:04
  • 2
    . Я добавлю его в сценарий. Просто не получил предупреждение, что был ответ на этот вопрос. Должен выяснить предупреждения на этом сайте. –  jim70 07.09.2012, 17:11

Если я понимаю Ваш вопрос, Вы не хотите извлекать что-либо, только заменять литеральной строкой zz20 с null.Односторонняя дорога:

FolderNo=$(echo "$FileToMove" | sed -r -e 's/^(.*)zz[0-9]+(\.pdf)$/\1null\2/')

Это сохраняет в группе 1 все символы до zz20 и в группе 2 все символы после соответствия. Единственные символы, не сохраненные, будут zz20 это потеряют и заменят с null.

1
27.01.2020, 23:21

Если Вы означаете заменять понятием пустого указателя, а не текстом "пустой указатель", Вы могли использовать это:

$ FolderNo=$(sed 's/_zz20//' <<< "2012-09-01 Home insurance quote_zz20.pdf")
$ echo $FolderNo
2012-09-01 Home insurance quote.pdf

Это заменит первое вхождение _zz20 ни с чем. Это вызвано тем, что вторая часть аргумента sed пуста (s/search/replace/ => s/_zz20//).

Мой пример не так осторожен как тот, который Вы цитируете, и один @Birei предлагает. Если какой-либо из Ваших файлов будет иметь несколько строк '_zz20', то вещи не получатся хорошо.

1
27.01.2020, 23:21

Теги

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