通过线路交换使用awk反转html的顺序

时间:2016-08-29 08:02:15

标签: bash awk

基本上每周我都要扭转以下代码段

<!-- Homepage Slider Begin -->
<div class="container-fluid">
  <div class="single-item-home hidden-xs">
    <div class="slide slide--has-caption">
      <a href="/1">
        <img src="/sliders/1_example.jpg">
      </a>
    </div>

    <div class="slide slide--has-caption">
      <a href="/2">
        <img src="/sliders/2_example.jpg">
      </a>
    </div>

    <div class="slide slide--has-caption">
      <a href="/3">
        <img src="/sliders/3_example.jpg">
      </a>
    </div>

    <div class="slide slide--has-caption">
      <a href="/4">
        <img src="/sliders/4_example.jpg">
      </a>
    </div>
  </div>
</div>
<!-- Homepage Slider End -->

基本上我想制作awk脚本并且有一个cron作业基本上采用第4-8行来交换行22-26而行10-14交换行{{1但是我似乎只能找到一种交换一条线而不是线块的方法。

这可能是16-20还是愚蠢?

4 个答案:

答案 0 :(得分:4)

您可以使用awk。脚本

 awk 'NR==FNR{line[i++]=$0} 
     END{
         for(j=0;j<i;j++){
         if(j>=3 && j<=7){
             print line[j+18];
             continue;
         }
         else if(j>=21 && j<=25){
             print line[j-18];
             continue;
         }
         else if(j>=9 && j<=13){
             print line[j+6];
             continue;
         }
         else if(j>=15 && j<=19){
             print line[j-6];
             continue;
         }
         print line[j];
         }
     }' file

会做你想做的事。

示例输出

<!-- Homepage Slider Begin -->
<div class="container-fluid">
  <div class="single-item-home hidden-xs">
    <div class="slide slide--has-caption">
      <a href="/4">
        <img src="/sliders/4_example.jpg">
      </a>
    </div>

    <div class="slide slide--has-caption">
      <a href="/3">
        <img src="/sliders/3_example.jpg">
      </a>
    </div>

    <div class="slide slide--has-caption">
      <a href="/2">
        <img src="/sliders/2_example.jpg">
      </a>
    </div>

    <div class="slide slide--has-caption">
      <a href="/1">
        <img src="/sliders/1_example.jpg">
      </a>
    </div>
  </div>
</div>
<!-- Homepage Slider End -->

注意:我保留数组边界检查。如果文件的内容是静态的,您可能不需要这个

答案 1 :(得分:2)

perl -e '@f=<>; print @f[0..2,21..25,8,15..19,14,9..13,20,3..7,26..$#f]' ip.html
  • -e选项从命令行本身传递Perl代码
  • @f=<>将文件内容(作为命令行参数传递)读入数组
  • 然后根据需要打印(索引从0开始,$#f给出数组的最后一个索引@f

答案 2 :(得分:2)

这并不关心每个块中有多少行或它们在文件中的开始/结束位置,并且它不需要您将整个文件存储在内存中(尽管大多数文件是“幻灯片”,需要存储,以便可能不是问题):

$ cat tst.awk
/<div class="slide/ { inSlide=1; slide="" }
inSlide {
    slide = slide $0 ORS
    if ( /<\/div>/ ) {
        slides[++numSlides] = slide
        inSlide = 0
    }
    next
}
/<\/div>/ {
    for (slideNr=numSlides; slideNr>=1; slideNr--) {
        printf "%s", slides[slideNr]
    }
    numSlides = 0
}
NF

$ awk -f tst.awk file
<!-- Homepage Slider Begin -->
<div class="container-fluid">
  <div class="single-item-home hidden-xs">
    <div class="slide slide--has-caption">
      <a href="/4">
        <img src="/sliders/4_example.jpg">
      </a>
    </div>
    <div class="slide slide--has-caption">
      <a href="/3">
        <img src="/sliders/3_example.jpg">
      </a>
    </div>
    <div class="slide slide--has-caption">
      <a href="/2">
        <img src="/sliders/2_example.jpg">
      </a>
    </div>
    <div class="slide slide--has-caption">
      <a href="/1">
        <img src="/sliders/1_example.jpg">
      </a>
    </div>
  </div>
</div>
<!-- Homepage Slider End -->

答案 3 :(得分:0)

这是一个解决方案,您可以在其中定义要在BEGIN部分中打印的订单,并按顺序打印:

$ cat > preordered.awk
BEGIN {
    split("1,2,3,22,23,24,25,26,9,16,17,18,19,20,15,10,11,12,13,14,21,4,5,6,7,8",a,",")
} 
{
    b[(NR in a?a[NR]:NR)]=$0
} 
END {
    PROCINFO["sorted_in"]="@ind_num_asc"
    for(i in b)
        print b[i]
}

试一试:

$ awk -f preordered.awk' file
<!-- Homepage Slider Begin -->
<div class="container-fluid">
  <div class="single-item-home hidden-xs">
    <div class="slide slide--has-caption">
      <a href="/4">
        <img src="/sliders/4_example.jpg">
      </a>
    </div>
...