2016-10-30 2 views
0

У меня есть команда bash, которая создает список файлов, для которых мне нужно изменить имя файла. так я думал использовать что-то вроде этого:Как изменить переменную awk с sed

mycommand | awk {mv $1 altered$1} 

проблемы заключается в том, что вторые $ 1 должны быть изменены с заменой SED некоторых регулярными выражениями. Как я могу применить sed к второму параметру?

Я пробовал с $() и |, но он не работает.

Я также попытался

awk '{print $1 sed "s/[^A-Za-z0-9._-]/_/g" <<< $1}' 
awk: cmd. line:1: Unexpected token 
+0

Рассматривали ли вы цикл с помощью возвращаемого списка имен файлов из вашей команды и изменяли их с помощью 'sed'? 'для имени файла в $ (mycommand); do mv $ filename $ (sed "s/[^ A-Za-z0-9 ._-]/_/g" <<< $ filename); done'. – Abdou

+0

Обратите внимание, что '' для имени файла в $ (mycommand) 'не будет выполнено, если какое-либо имя файла содержит пробелы. Цикл 'while' может избежать этого. – John1024

+0

Вспомните, что 'awk' имеет функции' sub() 'и' gsub() 'и что они могут делать большую часть того, что может сделать команда sed/str/repl /''. Возможно, вам понадобится выполнить несколько операций '[g] sub (/ regex /," repl "," str ")', чтобы получить то, что вам нужно. Удачи. – shellter

ответ

1

mv не команда AWK. Вам нужна оболочка. Попробуйте:

mycommand | while IFS= read -r f; do mv "$f" "${f//[^A-Za-z0-9._-]/_}"; done 

Это предполагает, что имена файлов разделены символом новой строки. Это нормально, если имя файла не содержит новую строку как часть ее имени. Для повышения надежности, mycommand и цикл while следует изменить, чтобы использовать NUL в качестве разделителя.

Как это работает:

  • while IFS= read -r f; do

    Это начинает цикл, который читает каждую строку, в свою очередь, в переменную f.

    IFS= сообщает оболочке о том, что ведущая или конечная пробельная строка содержит строку. Если mycommand создает лишние пробелы ведущего или конечного пробела, удалите это.

    -r сообщает оболочке, что она всегда поддерживает обратную косую черту.

  • mv "$f" "${f//[^A-Za-z0-9._-]/_}"

    переименовывает файл.

  • done

    Это сигнализирует конец цикла while.

1

Подходит ли вам подзаголовок? Если да, то простой способ вы можете сделать, как следует:

mv `mycommand | awk '{print $1}'` {altered$1} 
0

Использование rename (всегда установлен в Debian дистрибутивов на основе, с помощью требуемогоUtil-Linux пакета ):

rename 's/^/altered/' $(mycommand) 

 Смежные вопросы

  • Нет связанных вопросов^_^