Bash:转义文件列表

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]]'

ETC。

可以在内部(在 doit 中)转义空格,因为它不会影响 doits 标记器(它只会吃掉不在 ^ 后面的每个空格)。除了语法的良好可扩展性之外,读取配置文件和命令行的代码也是相同的。

sed 的功能是可以运行的,只是它在末尾添加了太多的 ;。但是,在 doit 中添加 ; 的逻辑并不难实现,因此最后一步不是必需的。我不喜欢的是,我需要一个循环来单独转义每个参数。仅 echo * | sed ... 不会这样做,因为 echo 会破坏信息(打印由空格分隔的所有内容)。

类似的问题:我想将 echo ~/my_progs/* 冒号分隔到路径变量中。

答案1

目前尚不清楚您要做什么,但基于“转义文件列表”,我认为这是解决方案:

IFS=$(echo -en "\n\b");
for file in $list; do
  sed -i 's/before/after/g' "$file";
done;

设置环境变量独立财务顾问(内部文件分隔符)将根据换行符正确地分隔文件。


或者,find如果您不想使用循环,请使用。

doit() { find -name "$@" -exec sed -i 's/before/after/g' {} \; }
doit myfiles*txt

答案2

好吧,我想直接在 shell 中执行此操作,但编译 C 程序效果更好。从 shell 的角度来看,这是一台“量子计算机”:一个比上面的 shell 脚本运行速度快得多的操作。我猜为每个文件生成 sed 需要更多时间。

#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;
    }

相关内容