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


16

.xml 파일이 있고 해당 .xml 파일에 수백 개의 라이브러리가 있기 때문에 RHEL6 시스템에서 "groupinstall"을 수행하려고합니다 (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라는 두 번째 파일로 추출하려고합니다. 그러나 위의 줄을 사용하면 FIRST 태그에서 내 파일 <id>의 마지막 </id>태그 까지 모든 것을 추출 합니다. 코드를 여러 번 추출하도록 변경하려면 어떻게해야합니까?

두 번째 질문은 -downloadonly 플러그인이 yum의 그룹에서도 작동합니까?


3
아가, 정규 표현식으로 XML을 다시 구문 분석하십시오. 즉 ... 문제에 대해 묻는 데요
gniourf_gniourf


8
그는 XML 을 구문 분석 하지 않고 특정 바이트 일치를 추출하도록 요청 합니다. 근본적인 차이점이 있습니다.
Runium

답변:


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>합니다. 사용 된 GNUism이 없습니다. 기본적인 정규식 지원 sed만으로 충분합니다.
그러나 여는 태그와 닫는 태그 같은 줄에 있어야합니다 . 그렇지 않으면 문을 다시 작성해야합니다.


1

이것은 XML이므로 XML 파서를 사용해야합니다. XMLStarlet 을 사용하는 솔루션은 다음과 같습니다 .

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

XPath 표현식 //group/idid노드 아래의 모든 노드 를 선택 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.

흠 ... yum DVD에 그룹 목록이 없습니다 (그래, 나는 모든 일반적인 "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
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.