sedを使用して2つのタグ間のテキストを抽出する

sedを使用して2つのタグ間のテキストを抽出する

.xmlファイルに何百ものライブラリがあるため(ほぼ16,000行)、RHEL6システムで「groupinstall」を実行しようとする.xmlファイルがあります。

したがって、次の構造を使用して.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という2番目のファイルに抽出しようとしています。ただし、上記の行を使用すると、<id>最初のタグから最後のタグまでファイルのすべての内容を抽出します。</id>コードを複数回抽出するにはどうすればよいですか?

2番目の質問は: - ダウンロード専用のプラグインはyumグループで動作しますか?

答え1

あなたに必要なものがもっと似ているようです

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

(あなたの例のように仮定し、そして<id>は同じ行にあり、</id>1行に1つだけあります)。<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、上記の作成者が望むのがこれだと思います。それで、このスクリプトが他の誰かに役立つことを願っています。私はこれまでこのスクリプトをかなり何度も使用してきました。

したがって、X / GUIが構成されていない「最小インストール」RHEL7サーバーに「GNOME DESKTOP」グループをインストールする必要があります。

[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
    

関連情報