0

最初の行が空白のファイルを印刷する次のスクリプトがあります。

for f in `find . -regex ".*\.php"`; do 
  for t in head; do 
    $t -1 $f  |egrep '^[  ]*$' >/dev/null && echo "blank line at the $t of $f"; 
  done; 
done

これを改善して、実際に空白行も削除するか、少なくとも最初の行が空白のすべてのファイルを別の場所にコピーするにはどうすればよいですか。

これを使用してコピーを試みました。これは、ディレクトリ構造を保持してコピーするためですが、すべてのphpファイルをコピーしており、egrepの正の出力をキャプチャして、それらのファイルのみをコピーする必要がありました。

rsync -R $f ../DavidSiteBlankFirst/
4

2 に答える 2

3

私はsedを個人的に使用します

find ./ -type f -regex '.*\.php' -exec sed -i -e '1{/^[[:blank:]]*$/d;}' '{}' \;

これにより、.phpで終わるすべての通常のファイルが検索され、最初の行でのみ機能するsedコマンドが実行され、空白かどうかが確認され、空白の場合は削除されます。ファイル内の他の空白行は影響を受けません。

于 2013-01-15T16:22:36.393 に答える
1

findとを使用するだけsedです:

find . -type f -name "*.php" -exec sed -i '1{/^\s*$/d;q;}' {} \;

この-type fオプションはファイルのみを検索します。サフィックスを付けてフォルダーに名前を付けることは期待していませんが、.phpこれは良い習慣です。の使用は、-regex '.*\.php'グロブを使用するだけではやり過ぎで面倒-name "*.php"です。-execシェルスクリプトの代わりにfindを使用すると、sedスクリプトはによって渡された一致する各ファイルを操作しますfind

sedスクリプトは最初の行のみを調べ、その中1の操作{}をその行に適用します。行が空白であるかどうかを確認し、行が/^\s*$/一致する場合は削除してスクリプトdを終了qし、ファイル内の他のすべての行を読み取らないようにします。このオプションは、のデフォルトの動作がに印刷される-iため、変更をファイルに保存します。代わりにバックファイルを使用する場合は、のバックファイルが作成されます。 sedstdout-i~file~file

于 2013-01-15T16:22:45.003 に答える