使用sed使用正则表达式清理文本文件

时间:2015-06-05 02:06:16

标签: regex macos sed

继续上一个问题 Sed on Mac not recognizing regular expressions

我正在编辑和清理多个文本文件,准备将它们输入到另一个软件中。我无法让Sed处理实际的正则表达式:

我知道这些不正确,但我最接近描述我感兴趣的代码。请将两行代码与输入和输出进行比较。

非常感谢任何帮助。

  1. 摆脱行尾的所有数字:

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

    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/;}' {} +
    
  3. 任何时候有两个或更多下划线,只用三个

    替换
    find . -type f -name '*.txt' -exec sed -i '' '/^$/{N; s/\_\_+/\_\_\_/;}' {} +
    
  4. 如果点之间有空格的省略号,请删除空格:

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

    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
    

1 个答案:

答案 0 :(得分: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'

第一个表达式处理除第一个之外的每一行开头的数字,其中数字似乎被保留,尽管声称代码应该“在行的开头摆脱所有数字”。

第二行用省略号替换省略号之间的空格,点之间没有空格。

第三行是用三个下划线替换两个或多个下划线的任何序列的一种方法。

第三,第四和第五行在标题行前插入<ACROSS PUZZLE><TITLE>行。

第六到第十四行将另一个常量材料插入文件中。

脚本的最后一行删除了数据的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>

这个更容易理解,但是要留下一些中间文件要删除,即使有人变得邋and并点击中断键。这很容易管理,但超出了直接问题的范围。

结合您的其他问题,您可以将DOWN行视为与上述相同。实际上,您可以安排将ACROSS替换为<ACROSS>,将DOWN替换为<DOWN>非常容易。如果有空行不需要,可以删除它们。通过确保整行包含DOWNACROSS(以及其他任何内容),您可以相当安全地避免错误的填字游戏线索。