积极观察与量词

时间:2014-05-13 03:33:19

标签: regex r awk sed

我正在尝试更改文件中的一些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>

我尝试使用正面的lookbehind,但我需要某种量词来捕获标记内部,并且似乎没有得到许多正则表达式实现的支持。

有什么建议吗?

此外,什么是最好的命令行工具,用于搜索和替换大量文件(sed,awk?)

谢谢!

3 个答案:

答案 0 :(得分:1)

你可以在没有外观的情况下做到这一点,只需执行替换。

正则表达式

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

替换

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

实施例

http://regex101.com/r/kM0rA4

答案 1 :(得分:1)

将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>

答案 2 :(得分:1)

也请尝试此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>