awk объединяет несколько строк - PullRequest
0 голосов
/ 19 октября 2011

Я хочу соединить строки между открывающим тегом и закрывающим тегом с классом «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 ]

1 голос
/ 20 октября 2011

Поскольку sed помечен в этом вопросе, вот одна строка:

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

Все строки пропущены, кроме специального случая "span class".Эти строки переносятся в область удержания, новые строки удаляются, а затем печатается то, что было бы многострочным.

1 голос
/ 19 октября 2011
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
...