5

(私はMac OS Xを使用していますが、この質問はUnixのその亜種に固有のものである可能性があります)

csplit正規表現を使用してファイルを分割しようとしています。これは、1つの長いテキストファイルにマージされたさまざまな記事で構成されています。各記事は「AllRightsReserved」で終わります。これは行の終わりにあります:grep Reserved$それらすべてを見つけます。ただ、csplit一致するものはないと主張している。

csplit filename /Reserved$/

収量

csplit: Reserved$: no match

これは明白で明白な嘘です。を省略した場合$、それは機能します。ただし、テキストの途中で「予約済み」が迷子にならないようにしたいと思います。行頭文字で別の単語を試しましたが、^うまくいくようです。他の単語(データの行末にある)も、使用すると一致しません(例and$)。

これはOSXの既知のバグですか?

[更新:すべてのキャリッジリターン文字を削除して、DOS/Unixの行末文字の問題ではないことを確認しました]

4

1 に答える 1

4

csplitのソースコードをhttp://www.opensource.apple.com/source/text_cmds/text_cmds-84/csplit/csplit.cからダウンロードし、デバッガーでテストしました。

パターンはでコンパイルされます

if (regcomp(&cre, re, REG_BASIC|REG_NOSUB) != 0)
    errx(1, "%s: bad regular expression", re);

線はと一致します

/* Read and output lines until we get a match. */
first = 1;
while ((p = csplit_getline()) != NULL) {
    if (fputs(p, ofp) == EOF)
        break;
    if (!first && regexec(&cre, p, 0, NULL, 0) == 0)
        break;
    first = 0;
}

問題は、によって返される行csplit_getline()の末尾に改行文字が残っていること\nです。したがって、「Reserved」は文字列の最後の文字ではなく、パターン「Reserved$」は一致しません。

の迅速で汚い挿入後

    p[strlen(p)-1] = 0;

入力文字列から末尾の改行を削除するには、「Reserved$」パターンが期待どおりに機能しました。

Mac OS Xのcsplitにはさらに問題があるようです。「csplitの正しい正規表現を探す」の回答に対する注釈を参照してください(繰り返し回数{*}も機能しません)。

備考:行末の「予約済み」を次のトリックと一致させることができます。

csplit filename /Reserved<Ctrl-V><Ctrl-J>/

ここで、実際にCtrlキーを使用して、コマンドラインに改行文字を入力します。

于 2013-02-19T23:05:46.643 に答える