2015-06-05 40 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