Bash: выход из списка файлов
Можно ли сделать это более красиво (укажите заполнитель для другой команды)
echo $(for x in *;do echo $x|sed 's/\([ \t\n\r\v\f\;#]\)/\^\1/g'|sed 's/$/\;/g';done)
Кроме того, не должно быть; после последнего имени файла.
Пример использования команды doit:
doit files[ list-of-files ] 'flags[foo;bar;other^ flag]options[value^ 1[1]value^ array[1;2;3]]'
и т.п.
Можно избежать пробелов внутри (в doit), поскольку он не влияет на токенизатор doits (он просто съедает все пробелы, не следующие за ^). Помимо хорошей расширяемости синтаксиса, код для чтения файлов конфигурации и командной строки одинаков.
Sed вещь работает, ожидайте, что она добавляет; слишком много в конце. Тем не менее, логика для добавления; внутри doit не сложно реализовать, поэтому этот последний шаг не является обязательным. Что мне не нравится, так это то, что мне нужен цикл, чтобы избежать каждого аргумента в отдельности. Просто эхо * | sed ... не будет этого делать, поскольку echo уничтожает информацию (печатая все, что разделено пробелами).
Аналогичная проблема: я хочу добавить echo ~/my_progs/* двоеточие, отделенное от переменной пути.
2 ответа
Непонятно, что вы пытаетесь сделать, но на основе "экранирования списка файлов" я думаю, что это решение:
IFS=$(echo -en "\n\b");
for file in $list; do
sed -i 's/before/after/g' "$file";
done;
Установка переменной среды IFS (Internal File Separator) для правильного разделения файлов на основе переносов строк.
Или, возможно, использовать find
если вы не хотите использовать цикл.
doit() { find -name "$@" -exec sed -i 's/before/after/g' {} \; }
doit myfiles*txt
Ну, я хотел сделать это прямо в оболочке, но компиляция C программы работает лучше. С точки зрения оболочки это "квантовый компьютер": одна операция, которая выполняется намного быстрее, чем сценарий оболочки выше. Я предполагаю, что для каждого файла требуется больше времени.
#include <cstdio>
int main(int argc, char* argv[])
{
if(argc==0)
{return -1;}
--argc;
++argv;
while(argc)
{
const char* arg=*argv;
while(*arg)
{
if(*arg>='\0' && *arg<=' ')
{putchar('^');}
switch(*arg)
{
case '[':
case ']':
case ';':
case '^':
case '#':
putchar('^');
}
putchar(*arg);
++arg;
}
--argc;
if(argc)
{putchar(';');}
++argv;
}
return 0;
}