2017-10-11 77 views
0

這可能是一個Sed和shell腳本語法問題以及正則表達式。 (編輯:也許一個I/O問題,因爲正則表達式讀取時使用bash shell中的文件,但實際.txt文件並沒有改變作爲所需的工作)Sed正則表達式OSX找到羅馬數字並用空字符串替換。錯誤「未終止的替代模式」

嘗試準備一個.txt文件對於一些自然語言處理工作。想要在包含莎士比亞的十四行詩的純文本文件中刪除一些羅馬數字,每個十四行詩以一個羅馬數字開頭,如IX.XVIII.,它表示單個十四行詩的標題,包括十進制字符。

例intput文本:

XXV.

Let those who are in favour with their stars

Of public honour and proud titles boast,

希望的輸出:

Let those who are in favour with their stars

Of public honour and proud titles boast,

this question的例子中,我嘗試了所有在終端的bash以下命令:

$ sed -i 's/[IVXLC]{1,}[.]//g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/^$/g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/()/g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/[]/g' sonnets.txt

當時的想法是用一個空字符串替換任何比賽。由於沒有工作,我試圖用空格字符替換匹配:

$ sed -i 's/[IVXLC]{1,}[.]/^ $/g' sonnets.txt

沒有運氣。以上所有的命令返回相同的錯誤:

sed: 1: "sonnets.txt": unterminated substitute pattern

我測試了正則表達式中的「查找」字段上https://regexr.com/,它似乎是正確的。目標文件在工作目錄中是正確的。任何想法出了什麼問題?我應該在Sed命令的「替換」字段中使用哪些字符?我應該修改正則表達式和/或Sed命令嗎?

+0

你能粘貼示例文本嗎?什麼是輸入和你喜歡輸出的樣子。 ? –

+0

我認爲'{'和'}'需要被轉義。 '\ {'和'\}'。方括號也可能需要不確定。 –

+0

'{} []'在https://regexr.com/ – Elan

回答

1

由於@Jonathan萊弗勒在評論中提到的,我的Mac使用BSD sed,這就是爲什麼該命令沒有工作。

因此,我通過自制安裝GNU sed

brew install gnu-sed

然後使用下面的命令:

gsed -i 's/[IVXLC]\{1,\}[.]//g' sonnets.txt

打字在gsed調用GNU sed,和它的工作如期望。它改變了.txt文件的內容。

在這種配置中,如@Hakan巴巴所提到的,正則表達式也需要轉義花括號:

\{\}

+0

您可能實際上沒有範圍/限制量詞,請參閱我的答案。 –

1

花括號需要轉義。

$ sed 's/[IVXLC]\{1,\}[.]//g' sonnets.txt 


Let those who are in favour with their stars 

Of public honour and proud titles boast, 
0

的問題似乎是與範圍(或限制性)量詞{m,n}這在您的BSD sed版本中不受支持。請注意,您可以重寫使用[IVXLC][IVXLC]*(一個羅馬「數字」,隨後與0+羅馬數字)的{1,}量詞:

sed -i 's/[IVXLC][IVXLC]*[.]//g' sonnets.txt 
      ^^^^^^^^^^^^^^^ 

另外,如果你需要確保你只在的開始匹配羅馬數字行,在模式開始時追加^(這意味着您也可以在正則表達式結尾處省略g修飾符)。要將它們匹配爲整個單詞,請在模式開始處添加[[:<:]]前導單詞邊界。

+0

有趣的想法與'[IVXLC] [IVXLC] *'!對於我正在處理的這個特定文件,它包含超過100個羅馬數字,表示莎士比亞所寫的所有十四行詩。標記整個文本輸入的開始和結尾的'^'和'$'字符可能不適用。 – Elan

+0

但是,'[[:<:]]'初始字邊界可能是有趣的。 –