2017-09-25 8 views
0

私はBASHでcsplitを使用して、区切り文字として1500-1600のファイルを年単位で区切ります。なぜ `csplit`と` grep`は一致するかどうか一致しませんか?

私は、コマンドに

csplit Shakespeare.txt '/1[56]../' '{36}'

を行うと、それはほとんど機能し、少なくとも二つの問題を除い:

  1. これは38個のファイルではなく、36を出力は、xx37を通じてxx00の番号が付け。 (xx00も完全に空白です。)これがどのように可能か分かりません。
  2. csplitは、私が期待した36の空ではないファイルの代わりに37の空でないファイルを返すように思われます。は15XXまたは16XXで始まらない - 「ACT 4 SCENE 15 \ n "(\ nは改行または改行を意味するものとします)。 csplitは、改行/改行と数字をどのように一致させることができないのか分かりません。

私は(私が欲しいものである)コマンド

csplit Shakespeare.txt '/1[56][0-9][0-9]/' '{36}'

を行うと、端末がエラーを返した:csplit: 1[56][0-9][0-9]: no matchプラス以上が実行されたときに、それが一覧表示されます数字のすべてが一覧表示されます。

grepがそう言うので、これは特に、私には意味がありません。

grep -c "1[56][0-9][0-9]" Shakespeare.txt
36

grep -c "1[56].." Shakespeare.txt
36

注:man csplit私はBSDを持っていることを示しているがバージョン2005年1月26日より。man grepは、私が2010年7月28日からBSDバージョンを取得したことを示しています。

+0

osxのbashです。「$ bash -version」は 'GNU bash version'を表示します。3.2.57(1)-release' –

+1

csplitは改行を次のように扱っていると思います。数? '/../'は数字だけでなく2文字を求めています。 – jwodder

+0

@DaveNewton私のシステムでこのコマンドを実行すると、 'GNU bash、version 3.2.57(1)-release(x86_64-apple-darwin15) Copyright(C)2007 Free Software Foundation、Inc.'が表示されます。要点は、多くのヘルプスレッド上のものです。このバージョンのBASHではうまくいきません。また、この問題は、BASHがシェルというよりもむしろ対話するコマンドライン関数で起こる可能性が高くなります。たとえば、 'man grep'を実行すると、GNUやLinuxではなく、「BSD general commands manual」のトップに表示されます。 – Chill2Macht

答えて

0

here by user 'DRL' on 06-20-2008の回答に基づいて、-kオプションをcsplitに追加しようとしました。

csplit -k Shakespeare.txt '/^1[56][0-9][0-9]/' '{36}'

これは、エラーが返さ:csplit: ^1[56][0-9][0-9]: no match

しかし、それはまだ(多かれ少なかれ)、所望の出力が得られた:ファイルxx36.txtを介しxx00.txtないxx37.txt)、および非各空のファイルxx01.txt - xx36.txtは、期待された/望ましい内容を持っていました。 (特に、「ACT 4 SCENE 15」で始まるファイルはありません。csplitため

manページは-kフラグについては、次の言葉:

-k Do not remove output files if an error occurs or a HUP, INT or TERM signal is received.

正直なところ、私は非常にこれが何を意味するか理解していないが、私はまだこのソリューションは働いていた理由について、次の推測を持っている/動作します。

予想:csplit正規表現と一致するファイルの先頭を期待します。したがって、ファイルの先頭行は^1[56][0-9][0-9]と一致していないため、-kフラグを付けずに怒鳴り、終了しました。

まだ、私はまだ1[56][0-9][0-9]がうまくいかなかった理由を理解できません。多分同じ理由です。 1[56]..がうまくいかなかった理由(つまり、csplitがパターンで始まらない37番目のファイルを作成した理由)を理解できていません。

関連する問題