sed를 사용하여 두 태그 사이의 텍스트 추출

sed를 사용하여 두 태그 사이의 텍스트 추출

.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라는 두 번째 파일로 추출하려고 합니다. 그러나 위 줄을 사용하면 <id>첫 번째 태그부터 마지막 ​​태그까지 파일의 모든 내용을 추출합니다. </id>코드를 여러 번 추출하려면 어떻게 변경해야 합니까?

두 번째 질문은: - 다운로드 전용 플러그인이 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, 위의 작성자가 원하는 것이 이것이라고 생각합니다. 그래서 이 스크립트가 다른 누군가에게 도움이 되기를 바랍니다. 저는 지금까지 이 스크립트를 꽤 여러 번 사용해 왔습니다.

따라서 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
    

관련 정보