【问题标题】:Lowercase all text except xml tags小写除 xml 标签外的所有文本
【发布时间】:2015-02-04 05:53:26
【问题描述】:

我有大量的标记字符串:

watch <TEAM>Philly's</TEAM> Game
what's on <TIME>Wednesday night eight o'clock</TIME>

我想将除 XML 标记之外的所有文本都小写。即

watch <TEAM>philly's</TEAM> game
what's on <TIME>wednesday night eight o'clock</TIME>

我可以使用 awk 将所有文本小写:

awk '{print tolower($0)}' file.txt

但不知道如何避免 XML 标记。欢迎使用任何语言/工具。

【问题讨论】:

    标签: xml linux awk sed


    【解决方案1】:

    这个 sed (gnu) 单线可能会有所帮助:

    sed -r 's/([^<>]*)($|<)/\L\1\E\2/g'
    

    用你的例子:

    kent$ echo "watch <TEAM>Philly's</TEAM> Game
    what's on <TIME>Wednesday night eight o'clock</TIME>"|sed -r 's/([^<>]*)($|<)/\L\1\E\2/g' 
    watch <TEAM>philly's</TEAM> game
    what's on <TIME>wednesday night eight o'clock</TIME>
    

    【讨论】:

    • 像魅力一样工作!我的工程师的好奇心现在问它是如何工作的!你介意解释一下命令吗?我看到带有两个捕获组的搜索/替换命令,但没有看到更多..
    • @xeon 将 \L\1\E\2 更改为 ######\2 然后您会看到正则表达式匹配的内容。对于\L \E,请阅读信息sed,有详细解释。
    • \E 在这种情况下是没用的。
    【解决方案2】:
    sed -e 's/\(.*\)/\L\1/' -e 's/\(<[^>]*>\)/\U\1/g' fileName
    

    【讨论】:

    • 看起来这个解决方案只是结合了两个命令(与第一个答案相比)。为什么你使用 \U 而不是 \E?
    • @xeon,它的方法略有不同。第一个表达式将所有内容都转换为小写,第二个表达式将 之间的任何内容都转换为大写。如果当前并非所有 xml 标记都是大写的,这可能会很方便。
    【解决方案3】:

    这里是使用awk的方法

    awk -F"<|>" '{for (i=1;i<=NF;i++) printf "%s",(i%2?tolower($i):"<"$i">");print ""}' file
    watch <TEAM>philly's</TEAM> game
    what's on <TIME>wednesday night eight o'clock</TIME>
    

    它通过&lt;&gt; 分隔字段,然后在当时循环通过第一个字段。
    如果是偶数就改小,如果奇数重新加&lt;&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多