지정된 줄이 발견되면 목록의 줄을 다른 파일에 추가하는 방법은 무엇입니까?

지정된 줄이 발견되면 목록의 줄을 다른 파일에 추가하는 방법은 무엇입니까?

기본적으로 2개의 파일이 있습니다. 다음과 같은 라우터 및 스위치 로그인 프롬프트 목록이 있습니다.

user@router1
user@router2
user@switch1
user@switch2

또 다른 파일에는 다음과 같은 XML 청크가 있습니다.

<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>
<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>

그래서 제가 하고 싶은 것은 XML 파일을 반복해서 검색할 때마다 <headTag>라우터/스위치 목록의 다음 항목을 그 위 줄에 배치하는 것입니다. 그러면 최종 출력은 다음과 같습니다.

user@router1
<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>
user@router2
<headTag>
    <anotherTag1>
    <anotherTag2>
    </anotherTag2>
    </anotherTag1>
</headTag>

이 목표를 어떻게 달성할 수 있나요? 저는 Red Hat Enterprise Linux Server를 사용하고 있으며 라우터/스위치 목록에 약 800개의 항목이 있고 동일한 수의 XML 청크가 있습니다.

답변1

또 다른 짧은 해결책은 다음과 같습니다.sed그리고ed.

XML 파일을 수정합니다.제자리에. 콘솔 출력을 무시합니다.

sed -e 's#.*#/<headTag>/i\n&\n.\n//\nw#' PATH_TO_LIST_FILE | ed PATH_TO_XML_FILE

명령줄은 sed목록 파일의 각 줄에 대해 다음 Ed 명령을 작성합니다.

/<headTag>/i                # search for tag and insert before
user@router1                # text to insert (= the current line in the list file)
.                           # end of insert
//                          # skip current tag (we are now on the line above the current tag))
w                           # save (could be postponed to the end, but makes the command shorter...)

<headTag>이 명령의 경우 항상 xml 파일의 줄 시작 부분에 있어야 합니다 .

답변2

여기 있어요:

perl -MTie::File -e '
$xml_file_name="path_to_xml_file";
$list_file_name="path_to_list_file";
tie @xml_lines,"Tie::File",$xml_file_name;
tie @list_lines,"Tie::File",$list_file_name;
@offsets = grep {$xml_lines[$_]=~/\Q<headTag>\E/} (0..$#xml_lines);
@offsets=reverse @offsets;
splice @xml_lines,pop @offsets,0,pop @list_lines;'

부인 성명

  • 이 코드는 XML 파일을 제자리에서 수정합니다. 원본 파일을 삭제하고 싶지 않다면 백업 복사본을 만드세요.
  • 이 코드는테스트되지 않은. 이 작업을 시도하기 전에 두 파일을 모두 백업하십시오.

편집하다

오타 수정: 6행에 추가된 물결표를 확인하세요 ~.

관련 정보