我正在尝试更改文件中的一些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?)
谢谢!
答案 0 :(得分:1)
你可以在没有外观的情况下做到这一点,只需执行替换。
<(\w+)[^"]*"(.*?)">(.*?)<\/\1>
<\1_\2>\3</\1_\2>
答案 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>