-1

Можно ли сделать это более красиво (укажите заполнитель для другой команды)

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 ответа2

1

Непонятно, что вы пытаетесь сделать, но, основываясь на "экранировании списка файлов", я думаю, что это решение:

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
0

Ну, я хотел сделать это прямо в оболочке, но компиляция 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;
    }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .