각 HTML 앞에 마지막 줄을 넣으십시오.sed와 함께

각 HTML 앞에 마지막 줄을 넣으십시오.sed와 함께

"ul"이 나타날 때마다 나는 다음과 같이 보이도록 해당(가장 안쪽에 포함된) "ul" 뒤에 "name: *****" 줄을 넣으려고 합니다.

앞으로:

<ul>
   <ul>
      <li href="https://www.deepl.com/translator">DeepL</li>
      <li href="https://translate.google.com">Google Trad</li>
      name: "Translate",
   </ul>
   <li href="https://www.youtube.com/feed/subscriptions">Youtube</li>
   <ul>
      <li href="https://www.facebook.com/">Facebook</li>
      <li href="https://twitter.com/">Twitter</li>
      <li href="https://www.instagram.com">Instagram</li>
      <li href="https://discordapp.com">Discord</li>
      name: "Network",
   </ul>
   name: "Fav",
</ul>

뒤쪽에:

<ul>
   name: "Fav",
   <ul>
      name: "Translate",
      <li href="https://www.deepl.com/translator">DeepL</li>
      <li href="https://translate.google.com">Google Trad</li>
   </ul>
   <li href="https://www.youtube.com/feed/subscriptions">Youtube</li>
   <ul>
      name: "Network",
      <li href="https://www.facebook.com/">Facebook</li>
      <li href="https://twitter.com/">Twitter</li>
      <li href="https://www.instagram.com">Instagram</li>
      <li href="https://discordapp.com">Discord</li>
   </ul>
</ul>

그래서 저는 다음과 같은 많은 것들을 테스트했습니다.

sed -i -e 'N;s/<ul>\([.\n]*\)\n\(.*\),/\2\n\1' fav.html

마지막 "ul" 다음의 "이름"이 항상 대체되는 것은 아니기 때문에 이것과 지금까지 내가 찾은 모든 것이 작동하지 않습니다. 누구든지 아이디어가 있다면 듣고 싶습니다.

답변1

에서는 이것이 불가능할 수도 있습니다 sed. (챌린지가 발행되었습니다. 틀렸다는 것이 증명되기를 기다리고 있습니다.) 특별히 sed해결책이 필요하다면 이 기사를 읽는 것을 중단하는 것이 좋습니다.

tac나는 다음의 조합으로 이 작업을 수행 할 수 있었습니다 awk.

tac fav.html | awk '
    /<\/ul>/    { flag=1;            level++; }
    /<ul>/      { print save[level]; level--; }
    flag  &&  /name/    { flag=0; save[level] = $0; next; }
                { print; }
    ' | tac > fav.html.new  &&  mv fav.html.new fav.html

tac fav.htmlfav.htmlReverse( 뒤로 tac철자 cat)를 한 줄씩 실행하여 다음을 생성합니다.

</ul>
   name: "Fav",
   </ul>
      name: "Network",
      <li href="https://discordapp.com">Discord</li>
   <ul>
   <ul>
<ul>

코드의 처음 두 줄은 중첩 수준을 awk계산합니다 . <ul>역순이므로 </ul>레벨이 증가하고  <ul>레벨이 감소합니다. 가 표시되면  아래쪽에서 블록에 진입하고 있음을 나타내도록  </ul>설정합니다 . 블록 의 맨 아래 근처에서 를 찾으면 이를 저장하고 해당 줄로 이동합니다( 줄을 인쇄하지 않고). a (즉, 블록의 시작 부분  ) 를 찾으면  자체적으로 인쇄하기 전에 저장된 내용을 인쇄합니다 .flag<ul>name<ul>nextname<ul><ul>name<ul>

결승전에서는 tac라인을 다시 뒤집어 대부분의 라인을 원래 위치로 되돌리고 모든 라인을 원래 위치로 되돌렸습니다.name 뒤쪽에해당 <ul>.

관련 정보