기본적으로 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행에 추가된 물결표를 확인하세요 ~
.