20


3

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

ETA:スクリプトやemacsなどで使えるように、それらをunixユーティリティにしたいのですが…

7 Answer


11


`+ diff -w +`を使用する場合、ファイル内の空白は無視されます。これはおそらくあなたのニーズに十分です。

編集:初めてこの記事を読み違えたのに気付いたのですが、実際には、 `+ \ r `の行末で動作する差分を探しています。 私の提案は、ファイルを ` \ n +`標準形式に変換できるhttp://ccrma-www.stanford.edu/~craig/utility/flip/[flip]のようなものでファイルを変換することです。

編集2 *:ちょうどあなたが欲しいもののように見える何かを見つけた - http://www.versiontracker.com/dyn/moreinfo/macosx/19069 [ Diff’nPatch *]:

_ Diff’nPatchは、GNUのdiff、patch、およびcmpユーティリティのMacintoshへの移植です。 それはあなたが2つのファイルやフォルダ間の違いを比較して見つけ、2つのファイルを照合し、さまざまなフォーマット(通常、コンテキスト、unidiffなど)で差分を生成し、パッチを適用し、バイトごとにファイルを比較することを可能にします。 任意のタイプの行末(mac、unix、windows)を処理​​できます _


8


Jayが言ったように、Diff’nPatchはあなたが探しているもののようです。 あるいは、次のような単一のコマンドで、すべての '\ r’行末を '\ n’に変換できます。

sed -ieの/ \ r / \ n / 'ファイル名

または

見つけます。 | xargs -n1 sed -ie '/ \ r / \ n /'

(後者の場合、ファイルのリストを何らかの方法でフィルタリングしたい場合があります。そうしないと、すべてのサブディレクトリのすべてのファイルに適用されます。)


7


OSX Lionにバンドルされているdiffユーティリティには、必要なオプション 'strip-trailing-cr’があります。 あなたはそれをこんな感じで使います:

diff -cpt a.c b.c  - ストリップトレーリングcr


1


dos2unixコマンドは、最初にファイルを一貫したフォーマットに変換するのに役立ちます。 私はそれがあなたが考えることができて、一度にたくさんのファイルで走ることができるちょうどほぼすべてのプラットフォームのために利用可能であると思います。 私はMac用のパッケージがあると思います。


1


PHPStormのdiffビューの "ignore whitespace"は*うまくいきます*。 キャリッジリターン/ EOL /改行/ what-have-youの違いは自動的に無視されます。 難解なunixコマンドなどを使って時間を無駄にすることも、実際に機能するものを手に入れて人生を進めることもできます。

  • 上記のソリューションのいずれかを使用すると、マウンテンライオンで失敗しました (正解としてマークされたものを含む)。 "Diff-npatch"のすべてのダウンロードリンクが失敗しました。 (私はhttp://webperso.easyconnect.fr/bdesgraupes/tools.htmlを見つけましたが、コマンドラインから呼び出すことができず、他のものと統合することができない差分ツールを使用することに頼らなければならないという考えは本当に嫌いです。私が使っているかもしれないIDEまたはVCSツール、例えばBBEdit、SourceTree、またはSmartSVN - BTWは、組み込みの差分ツールで改行を無視することができませんでした。

はい、私の改行は\ rですが、何ですか? 矢印! ソフトウェアがそのことを理解するにはバカすぎているならば、私はただ十分に賢い別のソフトウェアを使うつもりです。

PHPStormは、「正常に動作した」差分ツールを備えた唯一のソフトウェアでした - これは私がMacソフトウェアに期待することです。 Macソフトウェアに期待しています ちょうど仕事。 私はMacを使用しているので、毎回毎回難解な端末コマンドを学ぶ代わりに自分の仕事をすることができます。あなたはそれを間違ってやっているか、コマンド_simplyが他のすべての悪いソフトウェアと同じようにうまくいかない場合_。 "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」ファイルなのか。 「類似」とは何ですか? 文中の「is」とはどういう意味ですか、「GFMT」は「LTYPEまたは「変更」」です。 「に置き換えられる可能性がある」という意味ですか? もしそうなら、なぜ引用符や括弧などで "GFMT"ではないのですか? 例が示されていないので、知る方法はありません。ドキュメンテーションの表現は全くあいまいです。 「GFMTに含まれる可能性があるもの」とは何ですか…​ 平均? 「含む」とは、GFMTの頭字語を置き換えるテキストに含まれる可能性があることを意味しますか? 明確な例がないと、それはまったく役に立ちません。

あなたがそれを非常に不可解であいまいにするつもりであるならば、なぜマニュアルページを書くことさえ面倒にしても、それは基本的にソフトウェアの使い方をまだ知らない誰にも役に立たないのですか? その時点で、それはマニュアルではありません。使い方を思い出すことができるように、ソフトウェアを書いた人たちのためのクイックリファレンスページです。 実際に何が行われているのか知りたいのであれば、ソースコード自体を読むだけで済むと彼らは思います。

私の時間は貴重です。 私はむしろ、実際に正しく機能し適切な文書を持っているソフトウェアを手に入れるためにお金を払うだけです。

これらすべてが失敗したからです。

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

…​failed to ignore \r characters.

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

…​failed to ignore \r characters.

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

…​failed to ignore \r characters.

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

…​failed to ignore \r characters.

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

…​failed to ignore \r characters.

そのため、それらが\ n文字の場合、\ n文字が追加されたときにも失敗しました。

ここでtest.phtml ==

_ _ foo

bar _ _

そしてrest.html ==

_ foob​​ar _

"diff"コマンドは常に次のようなものを与えます。

_ _

'' '' '

  • 1,2 *! フー! bar \ファイルの終わりに改行なし

    • 1 ----! foob​​ar \ファイルの最後に改行なし _ _

      1. 不合格!


0


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

  • 1 *:差分をとり、ファイル名のみを一覧表示する

diff -r -q dir1 / dir2 /
  • 2 *:表示されているすべてのファイルを使用したエディタで開いて保存します。これにより行末が変更されます。

  • 3 *:通常の差分をとる

欠点は次のとおりです。

  • 堅牢性が低く、エラーが発生しやすい

  • たくさんのファイルがあるならもっと仕事


-1


これは私のために働きました:

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

私はOSXを使っていて、OSXとWindowsのファイルが混在しています。 クレジット:http://www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/