2015-06-05 39 views
0

延續先前的問題 Sed on Mac not recognizing regular expressions使用SED使用正則表達式

我編輯和清理多個文本文件,準備他們在另一個軟件的輸入清理文本文件。我一直沒有能夠讓Sed處理實際的正則表達式:

我知道這些不正確,但最接近的我可以來描述我感興趣的代碼。請將兩行代碼與輸入並輸出。

任何幫助非常感謝。

find . -type f -name '*.txt' -exec sed -i '' '/^$/{N; s/\n[0-9]+/\n/;}' {} + 
  • 格式文件:

    1. 獲得在行開始擺脫所有的數字

      find . -type f -name '*.txt' -exec sed -i '' '/^$/{N; s/([^\n]+)\nACROSS\n/<ACROSS PUZZLE>\n<TITLE>\n\1\n<AUTHOR>\n\n<COPYRIGHT>\n\n<SIZE>\n15x15\n<GRID>\n<ACROSS>\n/;}' {} + 
      
    2. 任何時候都有兩個或兩個以上的下劃線,只有三個

      更換
      find . -type f -name '*.txt' -exec sed -i '' '/^$/{N; s/\_\_+/\_\_\_/;}' {} + 
      
    3. 任何時候有省略號與點之間的空間,刪除空格:

      find . -type f -name '*.txt' -exec sed -i '' '/^$/{N; s/\. \. \.+/\.\.\./;}' {} + 
      

    輸入:

    nxd-12345678 Serial number of file 
    Title of File 
    ACROSS 
    1 __ fast 
    2 IRS-form experts 
    10 Lend. . . 
    12 Deals with adversity 
    

    輸出:

    nxd-12345678 Serial number of file 
    <ACROSS PUZZLE> 
    <TITLE> 
    Title of File 
    <AUTHOR> 
    
    <COPYRIGHT> 
    
    <SIZE> 
    15x15 
    <GRID> 
    <ACROSS> 
    ___ fast 
    IRS-form experts 
    Lend... 
    Deals with adversity 
    
  • +0

    標題總是在第二行嗎? ACROSS會不會出現在第三行?其餘的都很簡單。 –

    +0

    我很驚訝沒有人在你的線索中找到你 - sed總是做任何跨越多行的東西的錯誤工具。你應該使用awk。 –

    +0

    Ed。不,沒有人。我是前端開發人員,所以我只有這方面的基本知識。我的知識大多侷限於像PHP這樣的東西。我沒有太多的使用命令行技能。但是我能夠回答我所有的問題。我最終完成的這個腳本將幾個不同的任務組合成一個腳本。準備一大堆文件時節省大量時間,在該腳本之前,需要大量手動按摩數據才能爲其最終目的地做好準備。 – verbatim

    回答

    1

    假設的標題難題出現在第二行,而第三行始終是ACROSS,那麼就沒有任何大問題:

    sed -e '2,$s/^[0-9][0-9]* *//' \ 
        -e 's/\. \. \./.../g' \ 
        -e 's/___*/___/g' \ 
        -e '2i\ 
    <ACROSS PUZZLE>\ 
    <TITLE>' \ 
        -e '2a\ 
    <AUTHOR>\ 
    \ 
    <COPYRIGHT>\ 
    \ 
    <SIZE>\ 
    15x15\ 
    <GRID>\ 
    <ACROSS>' \ 
        -e '/^ACROSS$/d' 
    

    第一個表達式除第一每一行,其中的數字似乎被保留的開頭編號的交易,儘管聲稱的代碼應該「擺脫所有數字在行首'。

    第二行用省略號之間的空格替換省略號,點之間沒有空格。

    第三行是用三個下劃線替換任意兩個或多個下劃線序列的一種方法。

    第三行,第四行和第五行在標題行之前插入​​和<TITLE>行。

    第6行到第14行將另一個常量材料插入到文件中。

    該腳本的最後一行刪除了ACROSS行的數據。

    您可以創建小文件並在適當位置讀取這些文件,而不是使用插入和附加操作。

    sed -e '2,$s/^[0-9][0-9]* *//' \ 
        -e 's/\. \. \./.../g' \ 
        -e 's/___*/___/g' \ 
        -e '1r file.1' \ 
        -e '2r file.2' \ 
        -e '/^ACROSS$/d' 
    

    其中file.1包含:

    <ACROSS PUZZLE> 
    <TITLE> 
    

    file.2包含:

    <AUTHOR> 
    
    <COPYRIGHT> 
    
    <SIZE> 
    15x15 
    <GRID> 
    <ACROSS> 
    

    這是容易理解的,但給你留下一對夫婦的中間文件刪除,即使有人變得蠻橫並擊中中斷鍵。這很容易管理,但不在當前問題的範圍之內。

    結合您的其他問題,您可以將DOWN行與上面的行相同。事實上,你可以安排用<ACROSS>DOWN替換ACROSS,用<DOWN>很容易。如果有不需要的空白行,可以將其刪除。通過確保整行包含DOWNACROSS(而不是其他任何內容),您可以從填字遊戲的異常線索中合理安全。

    +0

    感謝您的快速響應。你是正確的,你注意到關於序列號。但是,我錯誤地指定了序列號。真的,每個文件的序列號都以一些字母開頭。對於在我的例子中只使用僞代碼,我表示歉意。我應該更準確。序列號都以字母「nxd」開頭。所以真正的序列號格式是:「nxd - ########」 – verbatim

    +0

    OK;這簡化了生活。只需從第一個表達式中刪除'2,$'。或者的確,將它留在那裏 - 它沒有任何危害,因爲你的第一行不會以數字開頭。提問時要小心。回答的人只有你告訴他們合作的東西,所以他們會逐字處理。 –

    +0

    你不需要所有那些'-e',只是第一個和其餘的是在同一個字符串(用';'或新行[更好的人類閱讀]作爲行動分隔符) – NeronLeVelu