【问题标题】:Positive Lookbehind With Quantifiers量词的正向回溯
【发布时间】:2014-06-30 14:26:43
【问题描述】:

我正在尝试更改文件中的一些 XML 标记,以使它们更容易读入 R,但某些标记是相同的,xmlToDataFrame 似乎不喜欢。见下文:

<DATE calender="Western">1996-06-22</DATE>
<DATE calender="Persian">1375/04/02</DATE>
<CAT xml:lang="fa">ادب و هنر</CAT>
<CAT xml:lang="en">Literature and Art</CAT>

我正在尝试使用正则表达式重命名一些标签,使其看起来更像这样:

<DATE_Western>1996-06-22</DATE_Western>
<DATE_Persian>1375/04/02</DATE_Persian>
<CAT_Persian>ادب و هنر</CAT_Persian>
<CAT_English>Literature and Art</CAT_English>

我尝试使用积极的后视,但我需要某种量词来捕捉标签内部,而这似乎不受许多正则表达式实现的支持。

有什么建议吗?

另外,对大量文件(sed、awk?)进行搜索和替换的最佳命令行工具是什么?

谢谢!

【问题讨论】:

  • lookbehinds 不支持量词,你可以使用 \K
  • 关于如何将&lt;CAT xml:lang="fa"&gt; 转换为&lt;CAT_Persian&gt; 的任何想法?你在某处的文件中有映射表吗?

标签: regex r awk sed


【解决方案1】:

您可以在没有后视的情况下执行此操作,只需执行替换即可。

正则表达式

<(\w+)[^"]*"(.*?)">(.*?)<\/\1>

替换

<\1_\2>\3</\1_\2>

示例

http://regex101.com/r/kM0rA4

【讨论】:

  • 他希望它是 1996-06-22 所以它将是 \3\1_\2 >
  • 他还想把&lt;CAT xml:lang="fa"&gt;翻译成&lt;CAT_Persian&gt;
  • @EdMorton ,我只是表明它可以完成,而不是提供整个解决方案:) 比赛需要分开。为所有事情做一个单行正则表达式是没有意义的。
【解决方案2】:

将 GNU awk 用于 gensub():

$ gawk '
BEGIN {
    map["fa"]="Persian"
    map["en"]="English"
}
{
    for (abbr in map)
        $0 = gensub("(xml:lang=\")" abbr "(\")","\\1" map[abbr] "\\2","")
    $0 = gensub(/(<[^[:space:]]+)[^"]+"([^"]+)">(.*)>$/,"\\1_\\2>\\3_\\2>","")
}
1' file
<DATE_Western>1996-06-22</DATE_Western>
<DATE_Persian>1375/04/02</DATE_Persian>
<CAT_Persian>ادب و هنر</CAT_Persian>
<CAT_English>Literature and Art</CAT_English>

【讨论】:

  • 嗨,Ed...对不起,我想我犯了一次问两个问题的错误。
【解决方案3】:

也试试这个sed 命令,

sed '/ xml\:lang\=\"fa\"/ s/fa/Persian/g; / xml\:lang\=\"en\"/ s/en/English/g; s|^<\(.*\) .*="\(.*\)">\(.*\)<\(.*\)>|<\1_\2>\3<\4_\2>|g' file

输出:

<DATE_Western>1996-06-22</DATE_Western>
<DATE_Persian>1375/04/02</DATE_Persian>
<CAT_Persian>ادب و هنر</CAT_Persian>
<CAT_English>Literature and Art</CAT_English>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多