22

私はかなり古いファイルをいくつか使用して、Mac で作業しています。異なるプログラムによって異なるファイルが作成されたため、\r (Mac) で終わるものと \n (Unix) で終わるものがあります。これらのファイルに対して diff や grep などのコマンドを実行できるようにしたいのですが、\r を含むファイルは 1 つの巨大な行として扱われます。すべての改行で正しく動作するdiffgrepなどのバージョンはありますか?

ETA: また、Unix ユーティリティにしたいので、スクリプトや Emacs などで使用できます...

4

7 に答える 7

12

これを使用diff -wすると、ファイル内の空白が無視されます。これで十分です。

編集\r:最初に投稿を読み間違えたことに気付きました。実際には、行末で機能する差分を探しています。私の提案は、ファイルを標準形式に変換できるフリップのようなものでファイルを変換することです。\n

EDIT 2:あなたが望むもののように見えるものを見つけました - Diff'nPatch

Diff'nPatch は、GNU 'diff'、'patch'、および 'cmp' ユーティリティの Macintosh へのポートです。2 つのファイルまたはフォルダーの違いを比較して見つけたり、2 つのファイルを照合したり、さまざまな形式 (通常、コンテキスト、unidiff など) で差分を生成したり、パッチを適用したり、ファイルをバイト単位で比較したりできます。任意のタイプの行末 (mac、unix、または windows) を処理できます。

于 2009-02-12T22:33:17.120 に答える
8

OS X v10.7 (Lion) にバンドルされている diff ユーティリティには、必要なオプション 'strip-trailing-cr' があります。次のように使用します。

diff -cpt a.c b.c --strip-trailing-cr
于 2011-10-10T13:07:07.837 に答える
3

PhpStorm の diff ビューの「空白を無視」は機能します。キャリッジ リターン / EOL / newline / what-have-you の違いを自動的に無視します。難解な Unix コマンドなどをいじって時間を無駄にすることも、実際に機能するものを手に入れて人生を前進させることもできます。

  • OS X v10.8 (Mountain Lion) で上記の解決策のいずれを使用しても失敗しました (正解としてマークされたものを含む)。「Diff-npatch」のすべてのダウンロード リンクが失敗しました。(私はhttp://webperso.easyconnect.fr/bdesgraupes/tools.htmlを見つけましたが、コマンドラインから呼び出すことができず、したがって統合された差分ツールを使用する必要があるという考えは本当に好きではありませんBBEditSourcetree、または SmartSVN など、私が使用している可能性のある IDE またはバージョン管理システム ツールはすべて、組み込みの diff ツールで改行を無視できませんでした。

はい、私の改行は \r ですが、それで何ですか? あっ!ソフトウェアが愚かすぎて \r == \n と認識できない場合は、十分スマートな別のソフトウェアを使用するだけです。

PhpStorm は、「正常に機能した」差分ツールを備えた唯一のソフトウェアでした。これは、Mac ソフトウェアに期待することです。私は、Mac ソフトウェアが正常に動作することを期待しています。私は Mac を使用しているので、難解な端末コマンドを毎回学習する代わりに自分の仕事をすることができます。これらは、ほとんどすべて文書化が不十分であり、コマンドがどのようにフォーマットされるべきかを明確な例なしで理解することを期待しているため、わかりません。やり方が間違っている場合、または他のすべての悪いソフトウェアと同じようにコマンドが単に機能しない場合。

「man diff」からこの例を取り上げます。

   -I RE  --ignore-matching-lines=RE
          Ignore changes whose lines all match RE.

さて、これを読んでも意味がわかりません。その使用例はありません。「RE」とは?どこにも言いません。

次に、この宝石があります:

  --GTYPE-group-format=GFMT
          Similar, but format GTYPE input groups with GFMT.

   --line-format=LFMT
          Similar, but format all input lines with LFMT.

   --LTYPE-line-format=LFMT
          Similar, but format LTYPE input lines with LFMT.

   LTYPE is `old', `new', or `unchanged'.
          GTYPE is LTYPE or `changed'.

          GFMT may contain:

   %<     lines from FILE1

   %>     lines from FILE2

   %=     lines common to FILE1 and FILE2

   %[-][WIDTH][.[PREC]]{doxX}LETTER
          printf-style spec for LETTER

          LETTERs are as follows for new group, lower case for old group:

   F      first line number

   L      last line number

   N      number of lines = L-F+1

   E      F-1

   M      L+1

          LFMT may contain:

   %L     contents of line

   %l     contents of line, excluding any trailing newline

   %[-][WIDTH][.[PREC]]{doxX}n
          printf-style spec for input line number

          Either GFMT or LFMT may contain:

   %%     %

   %c'C'  the single character C

   %c'\OOO'
          the character with octal code OOO

私はこの一節の意味をまったく理解できませんでした。「入力」とは何ですか?両方のファイルですか、それとも「to」ファイルだけですか、それとも「from」ファイルだけですか? 「似ている」とは何を指しているのですか?「GFMT は「LTYPE である」または「変更された」という文の「である」とはどういう意味ですか? 「置き換えられるかもしれない」という意味ですか?もしそうなら、引用符や括弧などで「GFMT」を使用しないのはなぜですか? 例が与えられていないので、知る方法はありません。ドキュメントの文言は完全にあいまいです。"GFMT may contain"... とはどういう意味ですか? 「含む」とは、頭字語 GFMT を置き換えるテキストにそれが含まれる可能性があることを意味しますか? 明確な例がなければ、まったく役に立ちません。

基本的に、ソフトウェアの使い方をまだ知らない人にとっては役に立たないほど不可解で曖昧なものにするつもりなら、わざわざマニュアルページを書く必要があるでしょうか? その時点で、それはマニュアルではありません。これは、ソフトウェアを作成した人が使用方法を思い出せるようにするためのクイック リファレンス ページです。彼らは、ソースコードが実際に何をするのか知りたければ、ソースコード自体を読むだけだと思っていると思います。

私の時間は貴重です。実際に正しく動作し、適切なドキュメントを備えたソフトウェアを手に入れるためにお金を払うだけです。

これらはすべて失敗したため:

 diff -d --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

...\r 文字を無視できませんでした。

 diff -wd --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

...\r 文字を無視できませんでした。

 diff -wd --suppress-common-lines --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

...\r 文字を無視できませんでした。

 diff -wd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

...\r 文字を無視できませんでした。

 diff -awd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

...\r 文字を無視できませんでした。

さらに言えば、それらが \n 文字である場合、 \n 文字が追加されたときにも失敗しました。

どこで test.phtml ==

ふー

バー

そしてrest.html ==

フーバー

「diff」コマンドは、常に次のような結果をもたらします。


*** 1,2 **** ! ふー!bar \ ファイルの最後に改行なし

--- 1 ---- ! foob​​ar \ ファイルの最後に改行はありません

... 不合格!

于 2014-03-03T21:34:31.800 に答える
0

私は次のクイックフィックスを使用しましたが、これには欠点があります (以下を参照)。

1 : diff を実行し、ファイル名のみを一覧表示します

diff -r -q dir1/ dir2/

2 : リストされているすべてのファイルを、使用したエディターで開いて保存します。これにより、行末が変更されます。

3 : 通常の差分を実行する

欠点は次のとおりです。

  • 堅牢性が低く、エラーが発生しやすい
  • ファイル数が多いと作業が増える
于 2010-11-22T11:19:09.523 に答える
-1

これは私のために働いた:

diff -r --ignore-all-space dir1/ dir2/

私は OS X を使用しており、OS X と Windows のファイルが混在しています。

クレジット: http://www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

于 2014-02-06T16:36:54.333 に答える