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

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

我有一个 .xml 文件,我正在尝试在 RHEL6 计算机上执行“groupinstall”,因为该 .xml 文件中有数百个库...(接近 16 000 行)。

因此,我尝试提取具有以下结构的 .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 的第二个文件中。但是,通过上面的行,它会提取文件中从第一个<id>标签到最后一个标签的所有内容。</id>如何更改我的代码以多次提取它?

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

答案1

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

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

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

或者使用 XML 感知工具:

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

答案2

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

这将与任何标签,当然也带有<a href="...">...</a>锚点。不使用 GNUisms — 基本的正则表达式支持sed就足够了。
然而:请注意开始和结束标签必须必须在同一行,否则语句必须再次重写。

答案3

请尝试一下

xml_grep 'id' file.xml --text_only

答案4

我读了这篇文章,希望解决提取 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
    

相关内容