awk加入多行

时间:2011-10-19 07:12:27

标签: sed awk

我想在开始标记和结束标记之间加入名为“content_subhd”的类, 例如:

<span class="content_subhd">1

2

3 </span>

<span class="xyz">1

2

3</span>

输出应为:

<span class="content_subhd">123</span>

<span class="xyz">1

2

3

</span>

如何实现,任何建议?

2 个答案:

答案 0 :(得分:1)

awk '/<span class="content_subhd">/, /<\/span>/ {
  r = r ? r $0 : $0
  if (/<\/span>/) {
    print r; r = x
    }
  next
  }1' infile

如果要替换现有文件的内容:

awk > _new_ '/<span class="content_subhd">/, /<\/span>/ {
  r = r ? r $0 : $0
  if (/<\/span>/) {
    print r; r = x
    }
  next
  }1' your_file && 
    mv -- _new_ your_file 

添加了批量替换解决方案(根据OP请求):

find <your arguments here> | 
  while IFS= read -r; do
    awk > _new_ '/<span class="content_subhd">/, /<\/span>/ {
  r = r ? r $0 : $0
  if (/<\/span>/) {
    print r; r = x
    }
  next
  }1' "$REPLY" && 
    mv -- _new_ "$REPLY" 
  done

答案 1 :(得分:1)

由于sed在此问题中被标记,因此这是一个单行:

 sed '/<span class="content_subhd">/,/<\/span>/{H;/<\/span>/{s/.*//;x;s/\n//g;p;};d}' source

除了特殊的“span class”情况外,所有行都会被传递。将这些线条放到保留空间,删除换行符,然后打印出多线条。