複数ファイルの先頭に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/' {} \;
    

    確認するためにBSDにアクセスできないため、正しく読み取られることをsed保証できません。\n単一のファイルに対してコマンドを試して-i確認するために最初のファイルは必要ありません。

  2. パール

    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 {} \;
    

関連情報