【问题标题】:What is the best way to clean a dirty file? [closed]清理脏文件的最佳方法是什么? [关闭]
【发布时间】:2020-12-15 03:14:09
【问题描述】:

我拿了一个很脏的xml文件研究了一下sed。看这里:

 <title><![CDATA[O BR-Linux está em pausa por tempo indeterminado]]></title>
 <title><![CDATA[Funçoes ZZ atinge maioridade: versão 18.3]]></title>
 <title><![CDATA[CloudFlare 1.1.1.1 e parceria com Firefox DoH]]></title>
 <title><![CDATA[Slint, Distro Baseada no Slackware e Acessível]]></title>
 <title><![CDATA[Utilização de CPU em sistemas Linux multi-thread]]></title>
 <title><![CDATA[Realidade Aumentada com 10 anos de idade e 10 linhas de código.]]></title>

我设法删除了垃圾,只保留了文字。但是,该解决方案并没有让我很满意。我想要一种方法来改善这一点,但我真的不知道如何。代码如下:

#!/bin/bash

# Trauvin

URL=http://br-linux.org/feed/

lynx -source "$URL" |
    grep '<title><!' |             # get tag title
    sed 's/<[^!>]*>//g' |          # remove tag title           
    sed 's/<[^<]>*//g' |           # remove <!
    sed 's/CDATA/''/g' |           # remove CDATA 
    sed 's/[[^[]//g' |             # remove the square brackets start 
    sed 's/[]*]]//g' |             # remove the squre brackets end
    sed 's/>*//g' |                # remove > end
    head -n 5

为了不再混淆,我使用了几个 sed,所以我可以在所有行上添加 cmets。

【问题讨论】:

  • 所以您希望改进一些工作代码?还是有什么问题?
  • 只是改进。它正在工作。
  • 那么 stackoverflow 对您来说是错误的站点,因为该站点用于调试问题。尝试在CodeReview 上发布以改进工作代码。请务必在发布之前查看他们的指南。
  • 你希望输出是什么样的?

标签: regex xml shell sed


【解决方案1】:

您可以逐步“解开”内容,而不是将结束与开始分开:

$ lynx -source "$URL" |
sed 's/<title>\(.*\)<\/title>/\1/' | # <title>x</title> -> x
sed 's/<!\[\(.*\)\]>/\1/' |  # <![x]> -> x
sed 's/CDATA\[\(.*\)\]/\1/' | # CDATA[x] -> x

【讨论】:

    【解决方案2】:

    处理 XML 文件的最佳方式是使用可识别 XML 的工具,而不是正则表达式。

    使用 XSLT 仅提取标题的示例:

    feed.xslt:

    <?ml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
      <xsl:for-each select="rss/channel/item">
        <xsl:value-of select="title"/><xsl:text>&#xA;</xsl:text>
      </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    

    应用于 RSS 提要时:

    $ xsltproc feed.xslt <(curl -s https://br-linux.org/feed/)
    O BR-Linux está em pausa por tempo indeterminado
    Funçoes ZZ atinge maioridade: versão 18.3
    CloudFlare 1.1.1.1 e parceria com Firefox DoH
    Slint, Distro Baseada no Slackware e Acessível
    Utilização de CPU em sistemas Linux multi-thread
    Realidade Aumentada com 10 anos de idade e 10 linhas de código.
    Nova versão da plataforma livre para o mapeamento de iniciativas em agroecologia
    Instalação do WordPress com Vagrant
    DatabaseCast 82: Ciência e dados
    Aplicando ferramentas open source para se dar bem no jogo Suikoden Tierkreis
    Tchelinux 2018: Chamada de palestras para Rio Grande
    Palestra on-line - conhecendo o Elastic Stack
    Curso gratuito básico de linux - Online e ao-vivo
    Aulas Particulares de Programação em Shell Script
    Protoboard em quadrinhos: manual apresenta 10 circuitos divertidos e desafiadores  que você mesmo pode construir
    

    【讨论】:

      【解决方案3】:

      xmlstarlet:

      URL='http://br-linux.org/feed/'
      lynx -source "$URL" | xmlstarlet select --template --value-of '//item/title'
      

      输出:

      O BR-Linux está em pausa por tempo indeterminado Funçoes ZZ atinge maioridade: 版本 18.3 CloudFlare 1.1.1.1 e parceria com Firefox DoH Slint, Distro Baseada no Slackware e Acessível 使用 CPU 系统 Linux 多线程 Realidade Aumentada com 10 anos de idade e 10 linhas de código。 Nova versão da plataforma livre para o mapeamento de iniciativas em agroecologia Instalação do WordPress com Vagrant DatabaseCast 82: Ciência e dados Aplicando ferramentas 开源 para se dar bem no jogo Suikoden Tierkreis Tchelinux 2018:Chamada de Palestras para Rio Grande Palestra 在线 - conhecendo o Elastic Stack Curso gratuito básico de linux - Online e ao-vivo Aulas Particulares de Programação em Shell Script Protoboard em quadrinhos: manual apresenta 10 circuitos dipidos e desafiadores que você mesmo pod contruir

      【讨论】:

      • 我总是忘记xmlstarlet...比手写样式表要好得多。
      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多