私はBASHでcsplit
を使用して、区切り文字として1500-1600のファイルを年単位で区切ります。なぜ `csplit`と` grep`は一致するかどうか一致しませんか?
私は、コマンドに
csplit Shakespeare.txt '/1[56]../' '{36}'
を行うと、それはほとんど機能し、少なくとも二つの問題を除い:
- これは38個のファイルではなく、36を出力は、
xx37
を通じてxx00
の番号が付け。 (xx00
も完全に空白です。)これがどのように可能か分かりません。 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バージョンを取得したことを示しています。
osxのbashです。「$ bash -version」は 'GNU bash version'を表示します。3.2.57(1)-release' –
csplitは改行を次のように扱っていると思います。数? '/../'は数字だけでなく2文字を求めています。 – jwodder
@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