我正在尝试在XML标记中找到一些特定信息,并将其转换为json字符串。我想出了最复杂的解决方案,但是它几乎可行。我只需要删除空格和换行符。但是我尝试过,即使是我的价值观也可以一起运行。
样本数据:
<config>
<derivedFrom>
<courseName>Family and Medical Leave</courseName>
<courseCode>FML</courseCode>
<courseAuthor>Company 1</courseAuthor>
<courseVersion>2.0.0</courseVersion>
<importLocale>en-US</importLocale>
</derivedFrom>
</config>
这是我正在使用的sed代码:
sed -n '
/<derivedFrom>/ {
:a;
N;
/<\/derivedFrom>/!ba;
s/.*<derivedFrom>//;
s/<\/derivedFrom>//;
s/<\/[a-zA-Z]*>/",/g;
s/</"/g;
s/>/":"/g;
s/[[:space:]]//g;
s/,$//g;
p
}'
最后,这是我当前的输出是"courseName":"FamilyandMedicalLeave","courseCode":"UBM2C","courseAuthor":"Alchemy","courseVersion":"2.0.021","importLocale":"en-US"
我知道我需要用其他内容代替[[:space:]]
,因为我不希望引号中的文本一起出现,但是我被卡住了。例如:家庭和病假应保留其空间。使用一些XML到JSON脚本可能还有一种更简单的方法。但是,我需要这样做,而无需在服务器上安装其他任何东西。
答案 0 :(得分:2)
注意:我不知道有关xml和json的所有详细信息。如您指定的那样,您无法安装程序,使用sed
和paste
的一些步骤可能会为您提供帮助。这仅供参考,可能并不能完全满足您的要求,并且假定数据格式如示例中所示
第1步:获取必要的行(有关详细信息,请参见How to select lines between two patterns?)
$ sed -n '/<derivedFrom>/, /<\/derivedFrom>/{//!p}' ip.txt
<courseName>Family and Medical Leave</courseName>
<courseCode>FML</courseCode>
<courseAuthor>Company 1</courseAuthor>
<courseVersion>2.0.0</courseVersion>
<importLocale>en-US</importLocale>
步骤2 :重新设置过滤后的行的格式
也可以与上一步合并为//!s|.*<\([^>]*\)>\(.*\)</\1>.*|"\1":"\2"|p
sed 's|.*<\([^>]*\)>\(.*\)</\1>.*|"\1":"\2"|'
"courseName":"Family and Medical Leave"
"courseCode":"FML"
"courseAuthor":"Company 1"
"courseVersion":"2.0.0"
"importLocale":"en-US"
第3步:使用粘贴将其加入
paste -sd,
"courseName":"Family and Medical Leave","courseCode":"FML","courseAuthor":"Company 1","courseVersion":"2.0.0","importLocale":"en-US"
答案 1 :(得分:0)
为什么不简单?对Bash有效
sed -n '
/<derivedFrom>/ {
:a;
N;
/<\/derivedFrom>/!ba;
s/.*<derivedFrom>//;
s/<\/derivedFrom>//;
s/<\/[a-zA-Z]*>/",/g;
s/</"/g;
s/>/":"/g;
s/,$//g;
p
}' input.txt | sed 's/^ *//g;s/ *$//g'
致谢!