Sed命令在找到图案时将其剥离,并将其添加到方形[]之间的以下行中,直到找到新的图案为止

Sed命令在找到图案时将其剥离,并将其添加到方形[]之间的以下行中,直到找到新的图案为止,sed,strip,Sed,Strip,这是我的出发点 #CHECK THISOUT ------EXAMPLE 1------ ; http://www.idontneed.com Google ; http://www.google.com Yahoo ; http://www.yahoo.com ------EXAMPLE 2------ ; http://idontcare.com Ebay ; http://www.ebay.com Amazon ; http://www.amazon.com 要匹配的模式是带有-----

这是我的出发点

#CHECK THISOUT
------EXAMPLE 1------ ; http://www.idontneed.com
Google ; http://www.google.com
Yahoo ; http://www.yahoo.com
------EXAMPLE 2------ ; http://idontcare.com
Ebay ; http://www.ebay.com
Amazon ; http://www.amazon.com
要匹配的模式是带有------某物的字符串------

所需输出为:

#CHECK THISOUT
[------EXAMPLE 1------]  Google ; http://www.google.com
[------EXAMPLE 1------]  Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------]  Ebay ; http://www.ebay.com
[------EXAMPLE 2------]  Amazon ; http://www.amazon.com
救命啊

perl -ne 'if (/^(------.*------) ;.*/) { $h = $1 }
          elsif ($h) { print "[$h]  $_" }
          else {print}' < input > output
perl-ne'if(/^(---.*-);.*/){$h=$1}
elsif($h){print“[$h]$\}
else{print}'输出
  • -n
    逐行读取输入
  • 如果一行包含模式,它将存储在
    $h
    变量中
  • 如果图案不存在,但之前已设置,则打印时会附加线条
  • 否则,打印该行(在满足任何图案之前打印第一行)
Perl来营救

perl -ne 'if (/^(------.*------) ;.*/) { $h = $1 }
          elsif ($h) { print "[$h]  $_" }
          else {print}' < input > output
perl-ne'if(/^(---.*-);.*/){$h=$1}
elsif($h){print“[$h]$\}
else{print}'输出
  • -n
    逐行读取输入
  • 如果一行包含模式,它将存储在
    $h
    变量中
  • 如果图案不存在,但之前已设置,则打印时会附加线条
  • 否则,打印该行(在满足任何图案之前打印第一行)

    • sed中非常容易:

      sed -e '/^------..*------/,$ {
               /^\(------..*------\).*/ { s//[\1]/; h; d; }
               G; s/\(.*\)\n\(\[.*\]\)/\2 \1/
              }' data
      
      说明:

      • 在找到触发图案之前,正常打印线条;脚本仅在找到第一个模式后更改任何内容。然后脚本的其余部分将运行
      • 如果该行是触发器模式,则捕获该模式并将其括在方括号中(
        s/../…/
      • 将图案复制到保留空间(
        h
      • 删除该行并移到下一行
      • 这是一条没有触发模式的线
      • 将保留空间的内容附加到换行符(
        G
        )后的模式空间
      • 将图案空间拆分为“换行前”和“换行后”,并在(
        s/../…/
        )之间使用空格重新排序
      • 让普通的“在周期结束时打印”打印结果
      如果希望在方括号和余数之间有两个空格而不是一个,请在第二个
      s/../../../
      中添加额外的空格

      示例输出:

      #CHECK THISOUT
      [------EXAMPLE 1------] Google ; http://www.google.com
      [------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------] Ebay ; http://www.ebay.com
      [------EXAMPLE 2------] Amazon ; http://www.amazon.com
      

      sed中这很容易:

      sed -e '/^------..*------/,$ {
               /^\(------..*------\).*/ { s//[\1]/; h; d; }
               G; s/\(.*\)\n\(\[.*\]\)/\2 \1/
              }' data
      
      说明:

      • 在找到触发图案之前,正常打印线条;脚本仅在找到第一个模式后更改任何内容。然后脚本的其余部分将运行
      • 如果该行是触发器模式,则捕获该模式并将其括在方括号中(
        s/../…/
      • 将图案复制到保留空间(
        h
      • 删除该行并移到下一行
      • 这是一条没有触发模式的线
      • 将保留空间的内容附加到换行符(
        G
        )后的模式空间
      • 将图案空间拆分为“换行前”和“换行后”,并在(
        s/../…/
        )之间使用空格重新排序
      • 让普通的“在周期结束时打印”打印结果
      如果希望在方括号和余数之间有两个空格而不是一个,请在第二个
      s/../../../
      中添加额外的空格

      示例输出:

      #CHECK THISOUT
      [------EXAMPLE 1------] Google ; http://www.google.com
      [------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------] Ebay ; http://www.ebay.com
      [------EXAMPLE 2------] Amazon ; http://www.amazon.com
      

      awk
      解决方案,类似于。使用
      作为字段分隔符,因此有额外的空间

      $ cat ip.txt 
      #CHECK THISOUT
      ------EXAMPLE 1------ ; http://www.idontneed.com
      Google ; http://www.google.com
      Yahoo ; http://www.yahoo.com
      ------EXAMPLE 2------ ; http://idontcare.com
      Ebay ; http://www.ebay.com
      Amazon ; http://www.amazon.com
      
      $ awk -F';' '{ if(/^------.*------/){ h = $1 } else if(h){ print "[" h "] " $0 } else {print} }' ip.txt
      #CHECK THISOUT
      [------EXAMPLE 1------ ] Google ; http://www.google.com
      [------EXAMPLE 1------ ] Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------ ] Ebay ; http://www.ebay.com
      [------EXAMPLE 2------ ] Amazon ; http://www.amazon.com
      

      awk
      解决方案,类似于。使用
      作为字段分隔符,因此有额外的空间

      $ cat ip.txt 
      #CHECK THISOUT
      ------EXAMPLE 1------ ; http://www.idontneed.com
      Google ; http://www.google.com
      Yahoo ; http://www.yahoo.com
      ------EXAMPLE 2------ ; http://idontcare.com
      Ebay ; http://www.ebay.com
      Amazon ; http://www.amazon.com
      
      $ awk -F';' '{ if(/^------.*------/){ h = $1 } else if(h){ print "[" h "] " $0 } else {print} }' ip.txt
      #CHECK THISOUT
      [------EXAMPLE 1------ ] Google ; http://www.google.com
      [------EXAMPLE 1------ ] Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------ ] Ebay ; http://www.ebay.com
      [------EXAMPLE 2------ ] Amazon ; http://www.amazon.com
      

      sed是对单个行的简单替换,仅此而已。为了清晰、可移植性、效率、简单性、可增强性、健壮性等,您应该使用awk:

      awk 'match($0,/-{5}.+-{5}/,a){ v="["a[0]"]  "; next } {print v $0}' file
      #CHECK THISOUT
      [------EXAMPLE 1------]  Google ; http://www.google.com
      [------EXAMPLE 1------]  Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------]  Ebay ; http://www.ebay.com
      [------EXAMPLE 2------]  Amazon ; http://www.amazon.com
      
      上面使用GNU awk作为第三个参数来匹配(),其他awk应该是:

      $ awk 'match($0,/-{5}.+-{5}/){ v="["substr($0,RSTART,RLENGTH)"]  "; next } {print v $0}' file
      #CHECK THISOUT
      [------EXAMPLE 1------]  Google ; http://www.google.com
      [------EXAMPLE 1------]  Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------]  Ebay ; http://www.ebay.com
      [------EXAMPLE 2------]  Amazon ; http://www.amazon.com
      

      sed是对单个行的简单替换,仅此而已。为了清晰、可移植性、效率、简单性、可增强性、健壮性等,您应该使用awk:

      awk 'match($0,/-{5}.+-{5}/,a){ v="["a[0]"]  "; next } {print v $0}' file
      #CHECK THISOUT
      [------EXAMPLE 1------]  Google ; http://www.google.com
      [------EXAMPLE 1------]  Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------]  Ebay ; http://www.ebay.com
      [------EXAMPLE 2------]  Amazon ; http://www.amazon.com
      
      上面使用GNU awk作为第三个参数来匹配(),其他awk应该是:

      $ awk 'match($0,/-{5}.+-{5}/){ v="["substr($0,RSTART,RLENGTH)"]  "; next } {print v $0}' file
      #CHECK THISOUT
      [------EXAMPLE 1------]  Google ; http://www.google.com
      [------EXAMPLE 1------]  Yahoo ; http://www.yahoo.com
      [------EXAMPLE 2------]  Ebay ; http://www.ebay.com
      [------EXAMPLE 2------]  Amazon ; http://www.amazon.com
      

      替换文本是否始终位于行的开头?它的简单程度有很大的不同。总是在开头,替换文本总是在行的开头吗?这对它的容易程度有很大的影响。总是在一开始,thanks@Francesco:是否存在
      awk
      是用法:awk[OPTIONS][awk_PROGRAM][FILE]-v VAR=VAL设置变量-F SEP使用SEP作为字段分隔符-F文件读取程序FILE@Francesco:是否存在
      awk
      是用法:awk[OPTIONS][awk_PROGRAM][FILE]-v VAR=VAL Set变量-F SEP使用SEP作为字段分隔符-F FILE从文件读取程序