使用sed提取2个标签之间的文本


16

我有一个.xml文件,我正在RHEL6计算机上尝试进行“组安装”,因为该.xml文件中有数百个库...(接近16000行)。

因此,我尝试提取具有以下结构的.xml文件中包含的组名:

<b>
<group>
<id> group name </id>
   <packages>
   ...
   </packages>
<id> group name 2 </id>
   <packages>
   ...
   </packages>
<id> etc... </id>
</group>
</b>

基本上,这就是我尝试过的:

sed -n '/<id>/,/<\/id>/p' test1.txt > test2.txt

我将.xml文件复制到test1.txt。我正在尝试将组名从test1.txt提取到另一个名为test2.txt的文件中。但是,使用上面的行,它将提取从FIRST <id>标记到</id>我文件中的最后一个标记的所有内容。如何更改代码以多次提取?

我的第二个问题是:-downloadonly插件是否可以与yum组一起使用?


3
亲爱的,再次使用正则表达式解析XML。那是自找麻烦……
gniourf_gniourf

1
看看这个
alecail

8
他不是要解析 XML,而是要提取特定的字节匹配。有根本的区别。
Runium

Answers:


31

听起来您需要的是更多类似的东西

sed -n 's:.*<id>\(.*\)</id>.*:\1:p'

(假设您的示例中<id></id>处于同一行,并且<id>...</id>每行只有一个)。

或使用支持XML的工具:

xmlstarlet sel -t -v '//id' -n

太整齐了,干杯!
fduff


1
$ echo '<id>I am a sample group</id>' | sed 's/<\/\?[^>]\+>//g'
I am a sample group
$

这将适用于任何标签,当然也适用于<a href="...">...</a>锚。没有使用GNUisms-基本的正则表达式支持sed就足够了。
但是:请注意,开始和结束标记必须位于同一行,否则该语句将不得不重新编写。


1

这是XML,您应该使用XML解析器。这是使用XMLStarlet的解决方案:

$ xml sel -t -v '//group/id' -nl data.xml
 group name
 group name 2

XPath表达式//group/id将选择id节点下的任何group节点。在-t -v表示“使用下面的模板来提取值”。将-nl在年底将确保输出以换行符结束。

上面的示例使用与您的XML文件相同的XML文件,但其中的任何行都已...删除。


0

我阅读了这篇文章,以解决提取Reqd的问题。RHEL 7.3 DVD中的软件包repos.xml,我想正是上述作者试图做的。因此,我希望该脚本可以对其他人有所帮助……我已经使用了很多次。

因此,我需要将“ GNOME DESKTOP”组安装到未配置X / GUI的“最小安装” RHEL7服务器上。

[root@rac01]# yum group list
Loaded plugins: ulninfo
There is no installed groups file.

嗯……在DVD上没有yum的组列表(是的,我尝试了所有常用的“ google”修复程序,但从未成功),因此求助于xml的硬列表。

  1. 装入DVD。
  2. 查找包含我所需的软件包列表的XML文件。
  3. 提取包组列表。
  4. 循环浏览软件包列表并安装(包括依赖项)。
  5. 假设您已经跑步createrepo /your/local_rpms/dir

    sudo su -
    mkdir /mnt/sr0
    mount /dev/sr0 /mnt/sr0
    cd /mnt/sr0
    
    FILE=$(find . -name "*.xml" | xargs grep '<id>gnome-desktop<\/id>'| cut -d: -f1)
    PKGLIST=$(sed -n '/<id>gnome-desktop<\/id>/,/<\/packagelist>/p' $FILE \
    | sed  -n  '/^ *<packagelist> *$/,/^ *<\/packagelist> *$/{/<packagereq type>/{d};p}' \
    | cut -d'>' -f2 \
    | cut -d'<' -f1)
    
    for p in ${PKGLIST}
       do
        yum deplist ${p}* | awk '/provider:/ {print $2}' | sort -u | xargs yum -y install
    done
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.