2013-02-19 56 views
3

(我正在使用Mac OS X,這個問題可能是特定於Unix的變體)

我試圖用正則表達式使用csplit拆分文件。它由合併成一個長文本文件的各種文章組成。每篇文章以「保留所有權利」結尾。這是在行的末尾:grep Reserved$找到他們全部。只有,csplit聲稱沒有匹配。

csplit filename /Reserved$/

產生

csplit: Reserved$: no match

其爲清晰和明顯的謊言。如果我忽略了$,它可以工作;但我想確保在文本中間不會出現任何'保留'雜散事件。我嘗試了一個字母開頭的字符^,這似乎工作。其他字(在數據的一行末尾出現)在使用時也不匹配(例如and$)。

這是OS X的一個已知錯誤嗎?

[更新:我確信它不是通過刪除所有回車字符的DOS/Unix行結束符問題]

回答

3

我從http://www.opensource.apple.com/source/text_cmds/text_cmds-84/csplit/csplit.c下載csplit可的源代碼,並在調試器中測試這一點。

圖案被編譯

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匹配。因此「保留」不是字符串中的最後一個字符,而「保留$」模式不匹配。

後的

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

一個快速和骯髒的插入刪除從輸入字符串「保留$」模式發揮預期的換行符。

在Mac OS X中似乎還存在更多csplit問題,請參閱Looking for correct Regular Expression for csplit的回答(重複次數{*}也不起作用)。

注:您可以用下面的招行的末尾匹配「保留」:

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

,你實際使用的控制鍵在命令行中輸入一個換行符。

+0

謝謝!我試過'分割文件名/保留。$ /'這也適用! – 2013-02-20 08:31:48

+0

@OliverMason:我看,這也是一個很好的解決方案/解決方法(點符合換行符)。 – 2013-02-20 08:34:32

相關問題