Sed命令在找到时去除模式,并在square []之间添加到后续行,直到找到新的

时间:2016-10-02 15:28:01

标签: 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

要匹配的模式是带有------ SOMETHING ------

的字符串

所需的输出是:

#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

4 个答案:

答案 0 :(得分:1)

Perl救援!

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

答案 1 :(得分:1)

sed

非常简单
sed -e '/^------..*------/,$ {
         /^\(------..*------\).*/ { s//[\1]/; h; d; }
         G; s/\(.*\)\n\(\[.*\]\)/\2 \1/
        }' data

说明:

  • 在找到触发模式之前,正常打印线条;该脚本仅在找到第一个模式时更改任何内容。然后脚本的其余部分运行。
  • 如果该行是触发器模式,请捕获该模式并将其用方括号括起来(s/…/…/)。
  • 将模式复制到保留空间(h)。
  • 删除该行并移至下一行。
  • 这是没有触发模式的行。
  • 在换行符(G)之后将保留空间的内容附加到模式空间。
  • 在换行符之前将模式空间拆分为&#39;和换行后的&#39;并使用(s/…/…/)之间的空格重新排序。
  • 在循环结束时让普通的打印出来&#39;打印结果。

如果你想要方括号和余数之间的两个空格而不是一个空格,请在第二个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

答案 2 :(得分:1)

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为第3个arg匹配(),与其他awks一起使用:

$ 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

答案 3 :(得分:0)

awk解决方案,类似于choroba's perl one-liner。使用;作为字段分隔符,因此有一个额外的空格

$ 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
相关问题