Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sed-shell脚本从XML标记中提取文本_Xml_Macos_Shell_Sed - Fatal编程技术网

使用sed-shell脚本从XML标记中提取文本

使用sed-shell脚本从XML标记中提取文本,xml,macos,shell,sed,Xml,Macos,Shell,Sed,我已经编写了脚本,它基本上以xml文件作为输入,并提取特定xml标记的文本,它正在工作。但它不够聪明,无法获取多行文本并允许使用特殊字符。非常重要的是,文本格式应该保持不变,因为它是在标记下定义的 以下是XML输入: <nick>Deminem</nick> <company>XYZ Solutions</company> <description> /** * * «Lorem» ipsum dolor sit a

我已经编写了脚本,它基本上以xml文件作为输入,并提取特定xml标记的文本,它正在工作。但它不够聪明,无法获取多行文本并允许使用特殊字符。非常重要的是,文本格式应该保持不变,因为它是在标记下定义的

以下是XML输入:

<nick>Deminem</nick>
<company>XYZ Solutions</company>
<description>
  /**
   * 
   *  «Lorem» ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
   *  tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
   *  At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd 
   *  no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit 
   *  consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore
   *  magna aliquyam erat, sed diam voluptua.
   *
   **/
</description> 
Deminem
XYZ解决方案
/**
* 
*«Lorem»同一天,同一天,同一天
*临时劳工和就业许可证,以书面形式提交。
*在vero eos和accusam以及justo duo dolores和ea Reum。斯特克里塔卡斯德
*没有大海,塔基马塔圣所是一个美丽的地方。同侧阴唇
*高级顾问,负责临时劳动
*麦格纳·阿利奎亚姆·埃拉特(magna aliquyam erat),塞德·迪亚姆·沃卢普图(sed diam voluptua)。
*
**/
上面的脚本提取每个特定标记的文本并分配给新的valueArray。我对sed的指挥是基本的,但总是愿意付出额外的努力

tagsArray=( nick company description )
noOfElements=${#tagsArray[@]}

for (( i=0;i<$noOfElements;i++)); do

OUT=`grep ${tagsArray[${i}]} filename.xml | tr -d '\t' | sed -e 's/^<.*>\([^<].*\)<.*>$/\1/' `

valueArray[${i}]=${OUT}
done 
tagsArray=(尼克公司描述)
noOfElements=${tagsArray[@]}

for((i=0;i使用regexp解析XML最终会导致麻烦,正如您所经历的那样。请花时间学习足够多(有很多)的知识,以正确转换XML,例如

编辑:

在试用了一些命令行xml实用程序之后,我认为可能是您的工具

tagsArray=(尼克公司描述)
noOfElements=${tagsArray[@]}
对于((i=0;i
)!/bin/sh
filePath=$1#XML文件路径
标记名=$2#用于获取值的标记名
awk'!/'RS=“|”$filePath

@AnderLindahi-没错,通过sed/awk解析XML不是一件容易的工作,因为这些工具不是用于智能XML处理的。但不幸的是,我要求使用sed使用schell脚本。@AnserLindahi-是预装的Mac OSX和Unix软件包吗?@Deminem:要求使用shell脚本是非常困难的就像要求某人用螺丝刀砍倒一棵树。这是可以做到的,但并不漂亮。@Jim:在我的场景中,要求使用shell脚本是很重要的,因为我不想依赖安装任何第三方工具来安装一些自定义模板,而这些模板可以通过shell脚本轻松完成。唯一的事情是最后读取XML格式的配置设置。如果您有更好的建议,可以用同一对数据替换我的配置设置数据格式,请告诉我。Deminem:配置的存储方式取决于您吗?您的shell脚本是唯一可以读取它的东西吗?RS定义在该变量中非常奇怪s在双引号中被替换,因此没有理由将它们排除在引号字符串之外。如果您想更明确地说明变量名,可以始终将它们放在大括号中,例如
RS=“|”
。除此之外,正则表达式不足以解析XML,因为它可以嵌套。例如,如果您可以在其内部具有相同的命名标记,则此代码将失败。
tagsArray=( nick company description )
noOfElements=${#tagsArray[@]}

for (( i=0;i<$noOfElements;i++)); do
    valueArray[${i}] = `xmlstarlet sel -t -v "/root/$tagsArray[i]" filename.xml`
done
#!/bin/sh
filePath=$1 #XML file path
tagName=$2  #Tag name to fetch values
awk '!/<.*>/' RS="<"$tagName">|</"$tagName">" $filePath