在bash中,我试图解析以下文件:输入:</a></td></tr><tr><td>stuff.txt (15.18 KB)</td><td>12/01/2015</td><td>Large things</td><td>158520312</td><td><a class="btn-down" download href="https://resource.com/stones"></a></td></tr><tr><td>flowers.pdf (83.03 MB)</td><td>23/03/2011</td><td>Large flowers</td><td>872448000</td><td><a class="btn-down" download href="https://resource.com/flosers with stuff"></a></td></tr><tr><td>apples.pdf (281.16 MB)</td><td>21/04/2012</td><td>Large things like apples</td><td>299009564</td><td><a class="btn-down" download href="https://resource.com/apples"></a></td></tr><tr><td>stones.pdf (634.99 MB)</td><td>11/07/2011</td><td>Large stones from mountains</td><td>67100270</td><td><a class="btn-down" download href="https://stuff.com/findstones">想要的输出:12/01/2015 158520312 "https://resource.com/stones"23/03/2011 872448000 "https://resource.com/flosers with stuff"21/04/2012 299009564 "https://resource.com/apples~withstuff"11/07/2011 67100270 "https://stuff.com/findstones"我的意思是:# less input.txt | sed -e "s/><tr><td//" -e "s/\///" -e "s/a>//" -e "s/<\/td><\/tr>//g" -e "s/<\/td><td>//g" -e "s/>$//g" -e "s/<a class=\"btn-down\" download href=//g"<stuff.txt (15.18 KB)12/01/2015Large things158520312"https://resource.com/stones"<flowers.pdf (83.03 MB)23/03/2011Large flowers872448000"https://resource.com/flosers with stuff"<apples.pdf (281.16 MB)21/04/2012Large things like apples299009564"https://resource.com/apples"<stones.pdf (634.99 MB)11/07/2011Large stones from mountains67100270"https://stuff.com/findstones"有没有更简单的方法来解析它?我觉得它可以简单得多,而且我也不在解析过程中。 最佳答案 就个人而言,我会使用perl,但这不是您要的,所以...一种逐步的方法,因此您可以在需要时编辑逻辑位。假设输入是一个名为x的文件:</a></td></tr><tr><td>stuff.txt (15.18 KB)</td><td>12/01/2015</td><td>Large things</td><td>158520312</td><td><a class="btn-down" download href="https://resource.com/stones"></a></td></tr><tr><td>stuff.txt (15.18 KB)</td><td>12/01/2015</td><td>Large things</td><td>158520312</td><td><a class="btn-down" download href="https://resource.com/stones"></a></td></tr><tr><td>flowers.pdf (83.03 MB)</td><td>23/03/2011</td><td>Large flowers</td><td>872448000</td><td><a class="btn-down" download href="https://resource.com/flosers with stuff"></a></td></tr><tr><td>apples.pdf (281.16 MB)</td><td>21/04/2012</td><td>Large things like apples</td><td>299009564</td><td><a class="btn-down" download href="https://resource.com/apples"></a></td></tr><tr><td>stones.pdf (634.99 MB)</td><td>11/07/2011</td><td>Large stones from mountains</td><td>67100270</td><td><a class="btn-down" download href="https://stuff.com/findstones">尝试这个:sed -E ' s/>$//; s/href=/>/; s/(<[^>]+>)+/~/g; s/~[^~]+~//; s/~[^~]+~/ /; s/~/ /;' x输出:12/01/2015 158520312 "https://resource.com/stones"23/03/2011 872448000 "https://resource.com/flosers with stuff"21/04/2012 299009564 "https://resource.com/apples"11/07/2011 67100270 "https://stuff.com/findstones"解释: sed -E'这使用扩展的正则表达式,并打开sed代码的脚本,以便我可以单独列出每个模式。每个函数都将在每一行上按顺序执行,因此效率不是很高,但是正则表达式代码可以“读取”,一旦理解它就可以合理维护,并且在需要调整时易于编辑。 s /> $ //;去除结尾的>,以保留URL,然后压榨所有其他标签。 s / href = /> /;使用href=作为钩子将>插入回去,这样我们就可以一次压缩所有标签。 s /(] +>)+ /〜/ g;将所有标记字符串以及其中的所有字符串都转换为一个简单的定界符。 s /〜[^〜] +〜//;消除前导和第二个定界符以及它们之间的第一个不需要的字段。 s /〜[^〜] +〜/ /;消除第三和第四定界符以及它们之间不需要的第三字段,将它们替换为输出中所需的空间。这两个非常相似,当然可以与最少的恶作剧结合使用,但是为了简化说明,我将它们留在了多余的位置。 s /〜/ /;将剩余的定界符转换为剩余字段之间所需的其他空格。 ' X关闭脚本并为其提供文件名以进行读取。显然,这留下了很多改进的空间,并且在许多方面都令人反感,但希望它是对技巧的简单解释,可以使您破解对问题有用且可维护的解决方案。祝好运。