这能做得更好吗(回应另一个命令的占位符)
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;
}