sed 在多个文件的开头插入不起作用

sed 在多个文件的开头插入不起作用

我碰到很多答案,包括论文:

而且我找不到办法做我想做的事。我需要在目录的每个文件#encoding:utf-8的开头插入(递归地)。.html.erb我尝试使用这个命令

find . -iname "*.erb" -type f -exec sed -ie "1i \#encoding:utf-8" {} \;

但它会抛出这个错误:

sed: 1: "1i #encoding:utf-8": i 命令末尾 \ 后的额外字符

答案1

就地编辑文件OSX sed,您需要设置空扩展名:

$ sed -i '' '1i\
#encoding:utf-8' filename

然后你需要一个换行符i\。这是由POSIX sed

仅有的GNU sed允许将文本与命令插入到同一行。

sed还可以同时处理多个文件,因此您可以使用-exec command {} +以下形式:

$ find . -iname "*.erb" -type f -exec sed -i '' '1i\
#encoding:utf-8' {} +

答案2

您可以在 Ex 模式下使用 Vim:

ex -sc '1i|#encoding:utf-8' -cx file
  1. 1选择第 1 行

  2. i插入文本和换行符

  3. x保存并关闭

答案3

以下是做你想做的事情的几种方法:

  1. sed

    find . -iname "*.erb" -type f -exec \
     sed -i '' '1s/^/#encoding:utf-8\n/' {} \;
    

    我无法访问 BSDsed进行检查,因此我无法保证\n能够正确读取。在单个文件上尝试该命令,并且无需-i第一个文件来确认。

  2. Perl

    find . -iname "*.erb" -type f -exec \
        perl -i -pe 'print "#encoding:utf-8\n" if $.==1;' {} \;
    
  3. find . -iname "*.erb" -type f -exec \
        sh -c 'echo "#encoding:utf-8" >tmp && cat "$1" >> tmp && mv tmp "$1"' sh {} \;
    

相关内容