複数のファイルの先頭にタグを追加するにはどうすればよいですか?


回答:


18
sed -i "1s/^/<?php /" file

-iインプレース編集用です。)

よりポータブルなバージョン:

ed file <<!
1s/^/<?php /
wq
!

気の利いた-それは私が説明しようとしていたものよりも少し簡単です:)
ウォーレン

ここで-i引数に拡張子を追加する必要があります。sedまたはGNU sedを使用していますか?

リチャード:私が使用しているのはGNU sedであると主張しており、バックアップサフィックスを追加できます。
grawity

2
私はBSD sedを使用しており、インプレース編集が可能ですが、拡張機能を提供する必要があります。ie 'sed -i .bak "PATTERN"ファイル'

3
-i移植性がなく、構文は実装ごとに異なり、シンボリックリンクを壊します。実際にファイルを編集するように設計されたアプリケーションを使用したほうがよいでしょう。
クリスダウン

5

AWKこのようなフィルターを使用できますが、

awk '{if(NR == 1)printf "%s%s"、 "PREFIX"、$ 0; そうでなければprint $ 0} 'testfile> newfile

PREFIXphpプレフィックス文字列はどこにありますか。


5

まだコメントを残すことはできませんが、1つのステップですべてを行うには:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;

それを愛し、時間を節約しました。
スティーブヒル14

5

perl one-linerでそれを行うことができます:

perl -0777 -p -i -e "s/^/hey /g" testfile

-0777力ファイルズルズルモードは、そのファイル全体を1行として読まれます。-pループを有効にします。-iファイルのインプレース編集を有効にします。^行の始まりを示します。

$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf

更新:コメントに示されているように、の-i.bak代わりにを使用してバックアップを自動生成することを選択できます-i。これにより、コマンドにエラーが発生した場合の安全性が向上します。への引数-i は、バックアップのサフィックスになります。

多数のファイルを更新する場合、コマンドを-i.backup${RANDOM}で実行し、すべてのファイルが正しく更新されたことを確認してから、その拡張子を持つすべてのファイルを削除できます。


1
参照「その値を持つ法的なバイトがないので吸い込みにPerlを引き起こします値0777は、ファイル全体」sial.org/howto/perl/one-liner/#s3.5
クリス・W.レア

1
-i接尾辞なしでフラグを使用することを推奨する場合、これはバックアップがないこと意味することを読者に警告してください。さらに数文字(-i.bak)の場合、ワンライナーにタイプミスが含まれている場合に備えてバックアップを取得します。-pそれ以外の場合は、かなり単純なタイプミス(たとえば、フラグを忘れる)が1日中台無しになります。
テレマコス

@Telemachus-同意しました。更新しました。

4

sedストリームの編集用-ファイルはストリームではありません。edまたはのような、この目的のためのプログラムを使用しexます。の-iオプションsedは移植性がないだけでなく、発生する可能性のあるシンボリックリンクもすべて切断します。これは、基本的に削除して再作成するためです。これは無意味です。

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done

提示したのは、単一のファイルを編集する基本的な方法です。これは問題に答えていないようです-質問はいくつかのファイルを変更することに関するものです(一見すると明らかではないかもしれませんが)。edその目的で使用する方法がわかっている場合は、回答でこれを示してください。
rozcietrzewiacz

@rozcietrzewiacz-grawityは単一のファイルを編集する同じ方法(受け入れられた)を示したので、答えには適切だと思いました。いずれにせよ、私はそれをforループに入れました。
クリスダウン

0

ディレクトリ内のすべてのファイルの末尾に何かを追加するために書いたものの代替(bash):

for FNAME in *
do
    echo "?>" >> $FNAME
done

私はあなたのfindワンライナーが好きですが:)


$FNAMEあるべき$fname-慣例により、私たちは環境変数(PAGER、EDITOR、SHELL、...)と内部シェル変数を大文字(BASH_VERSION、RANDOM、...)。他のすべての変数名には、少なくとも1つの小文字を含める必要があります。この規則により、環境変数および内部変数が誤ってオーバーライドされるのを防ぎます。
クリスダウン

@クリスダウン-私の全体のキャリアを見たコンベンションは、設定によって異なります:小文字、大文字、ラクダケース:)
ウォーレン

キャメルケースと小文字は問題ありません。いずれにせよ、環境変数ではない変数は完全に大文字にしないでください。
クリスダウン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.