0

拡張子が.phpまたは.htmlのすべてのファイルの先頭から、改行(Macではキャリッジリターン)の発生をすべて削除する必要があります。スペースなどのように、改行の間に他の文字はありません。

したがって、たとえば(改行の例として/ lfを使用):

/lf
/lf
<!doctype html>

また

/lf
<!doctype html>

次のように減らす必要があります。

<!doctype html>

私が見つけたラインフィードを削除する1つの方法は次のとおりです。

tr -d '\012'

しかし、最初の数行は言うまでもなく、これを特定のファイルにターゲティングする方法がわかりません。

だから私は次のものを持っています:

find . \( -name "*.php" -or -name "*.html" \) | xargs grep -l "\012" | xargs sed -i -e "s/\012//g"

しかし、これは最初の数行だけをターゲットにするわけではなく、ラインフィードも正しくターゲットにするかどうかは完全にはわかりません。

それで、誰かが何か明るいアイデアを思いついたのですか?

4

4 に答える 4

2

試す:

sed -i '/./,$\!d' filename

または検索からでも:

find . \( -name "*.php" -or -name "*.html" \) -exec sed -i '/./,$\!d' {} \;

編集:

\前は必要!dないかもしれませんが、私のシェルでは、!シンボルを介して前のイベントを参照しているとcshが考え続けるため、エスケープする必要があります。


編集2:

だから/./,$\!d、少し、それはぎこちないように見えますが、これが起こっていることです。

  1. ここでは2つのアドレスが定義されています。最初のアドレスは.、空白行ではないものである正規表現です。したがって、最初のアドレスは、によって一致する最初の非空白行/./です。
  2. 次に、で区切られた2番目のアドレスがあり、,それは単に$ファイルの終わりです。したがって、2つのアドレスで定義した領域は、ファイルの最後までの最初の非空白行です。
  3. ここでは、 sedのdelete関数を使用します。これはd、スクリプトの最後で示されています。ただし、を使用するdと、空白以外の最初の行からファイルの終わりまでのすべてが削除されます。
  4. 最後に、必要なものを削除するので!、コマンドの前にある権利を使用してd、sedに「OK、代わりに指示しているのとは正反対のことを実行してください」と伝えます。したがって、最初の非空白行からファイルの最後まですべてを削除するのではなく、完全に反対のことを行い、最初の非空白行をファイルの最後まで保持します。これにより、すべてが削除されます。ファイルの先頭にある空白行の。

p(print)コマンドを使用してこれを行う方法はおそらくあります。これは、deleteの反対のようなものですが、実際にはそのようには動作しません。pまたはを使用してこれを行う方法があると確信しています!p

于 2012-10-20T08:28:07.820 に答える
2

Perlがインストールされている場合、このタイプの処理にはPerlが適しています。空白以外の文字を含む行が見つかると終了する、少し「do..until」ループを実行できます。頭のてっぺんから:

do {

  s/^\s$//;

} until ( /^\S/ );

(ただし、これらの正規表現が最初に実行したいことを実行することを確認してください!)

于 2012-10-20T08:28:08.393 に答える
0

改行が最初の10行だけにあることがわかっている場合は、最初の10行でのみ動作するようにSEDコマンドを変更できます。それは1,10以下です。

xargs sed -i -e "1,10s/\012//g"
于 2012-10-22T02:36:10.977 に答える
0

使用する:

 find /path/to/root/directory -type f -exec tr -d '\012' {} \;

ここで、/ path / to / root / directoryは、すべてのオカレンスを削除するためにすべてのファイルを検索した最上位のパスです。

于 2012-10-20T08:29:26.523 に答える