이전 줄에 표시가 있는 경우에만 줄을 삭제하세요 - sed? 아니면 더 쉬운가요?

이전 줄에 표시가 있는 경우에만 줄을 삭제하세요 - sed? 아니면 더 쉬운가요?

나는 상당히 초보자 문제에 직면하고 있는데 그것이 내 관심을 끌었습니다 :( xml 태그가 있는 파일이 있고 내가 발견했을 때:

    </ac:image>
  </a>

뒤에 </ac:image>가 있고 </a>가 있는 줄을 삭제합니다 </a>.

이전에도 "a href"가 있었지만 그것은 매우 구체적이어서 sed와 match를 사용하여 제거했습니다. 이 시점에서 여러 줄 일치인 경우 어떻게 처리할지 궁금합니다. 일치하는 두 번째 줄을 선택하는 방법을 잘 모르겠습니다.

누군가 나에게 올바른 방향을 알려줄 수 있습니까?

답변1

항상 동일한 순서라면 놀랄 일도 아니며 XML 구문 분석이 필요하지 않으며 작동합니다 sed.

항상 두 행의 쌍을 확인하려면 다음 N;P;D패턴을 사용하십시오 sed.

sed 'N;P;\_</ac:image>\n *</a>$_d;D' filename

어떻게 작동하나요?

  • N다음 줄을 추가합니다. 일반적으로 $!N다음 줄이 있는지 확인하지만 귀하의 경우에는 문제가 되지 않습니다. 다음 줄이 없으면 특별한 일이 발생하지 않습니다.
  • 이제 버퍼에 두 줄이 있습니다. P첫 번째 줄을 인쇄하세요.
  • \_</ac:image>\n *</a>$_d d주어진 두 줄 패턴( \n줄 사이의 개행 문자)이 발견되면 패턴 공간이 제거됩니다. 첫 번째 줄이 인쇄되므로 패턴 공간을 제거하면 쌍의 두 번째 줄만 제거됩니다.
  • 마지막 문은 패턴이 일치하지 않는 경우에만 실행됩니다. 첫 번째 줄(및 개행)을 제거 D하고 쌍의 두 번째 줄로 루프를 다시 시작하므로 모든 줄 쌍이 검사됩니다.

답변2

gsed '/<\/ac:image>/,+1 { /<\/a>$/d; }' testfile.txt

gsedGNU 의 약자 입니다 sed.

관련 정보