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


16

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

2番目の質問は、-downloadonlyプラグインはyumのグループでも機能しますか?


3
ああ、XMLを正規表現で再び解析します。それはトラブルを求めている
...-gniourf_gniourf

1
見ていこれを
alecail

8
彼はXML を解析するのではなく、特定のバイトの一致を抽出するように求めています。基本的な違いがあります。
ルニウム

回答:


31

必要なものは、

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

(サンプルのように<id></id>が同じ行にあり、<id>...</id>行ごとに1 つしかないと仮定します)。

または、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>アンカーでも機能します。GNUismは使用されていません-基本的な正規表現のサポートで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ファイルを使用していますが、含ま...れている行はすべて削除されています。


0

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"の修正プログラムをすべて試してみましたが、動作しませんでした)。

  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
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.