Sed заменяет каждый n-й случай - PullRequest
12 голосов
/ 02 мая 2011

Я пытаюсь использовать sed для замены любого другого вхождения html-элемента файла, чтобы я мог создавать чередующиеся цветные строки.

Вот то, что я пробовал, и это не работает.

sed 's/<tr valign=top>/<tr valign=top bgcolor='#E0E0E0'>/2' untitled.html

Ответы [ 3 ]

11 голосов
/ 02 мая 2011

Я бы решил это с помощью awk:

awk '/<tr valign=top>/&&v++%2{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")}{print}' untitled.html 

Сначала проверяется, содержит ли строка <tr valign=top>

/<tr valign=top>/&&v++%2

и является ли <tr valign=top> нечетным найденным экземпляром:

v++%2

Если это так, он заменяет <tr valign=top> в строке

{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")}

Так как все строки должны быть напечатаны, есть блок, который всегда будет выполняться (для всех строк) и напечатает текущую строку:

{print}
3 голосов
/ 02 мая 2011

Это работает для меня:

sed -e "s/<tr/<TR bgcolor='#E0E0E0'/g;n" simpletable.htm

пример ввода:

<table>
  <tr><td>Row1 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row2 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row3 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row4 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row5 / col1</td><td>col2</td><td>col3</td></tr>
</table>

образец вывода:

<table>
  <TR bgcolor='#E0E0E0'><td>Row1 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row2 / col1</td><td>col2</td><td>col3</td></tr>
  <TR bgcolor='#E0E0E0'><td>Row3 / col1</td><td>col2</td><td>col3</td></tr>
  <tr><td>Row4 / col1</td><td>col2</td><td>col3</td></tr>
  <TR bgcolor='#E0E0E0'><td>Row5 / col1</td><td>col2</td><td>col3</td></tr>
</table>

Ключ должен использовать команду n в sed, которая переходит к следующей строке. Это работает, только если TR занимают разные линии. Он будет разрываться с вложенными таблицами или если в одной строке будет несколько TR.

0 голосов
/ 17 августа 2016

Согласно http://www.linuxquestions.org/questions/programming-9/replace-2nd-occurrence-of-a-string-in-a-file-sed-or-awk-800171/

Попробуйте это.

sed  '0,/<tr/! s/<tr/<TR bgcolor='#E0E0E0'/' file.txt

Восклицательный знак отменяет все, начиная с начала файла и заканчивая первым «Джеком», так что подстановка работает во всех следующих строках. Обратите внимание, что я считаю, что это только операция GNU SED.

Если вам нужно оперировать только вторым вхождением и игнорировать любые последующие совпадения, вы можете использовать вложенное выражение.

sed  '0,/<tr/! {0,/<tr/ s/<tr/<TR bgcolor='#E0E0E0'/}' file.txt

Здесь выражение в квадратных скобках будет работать на выходе первой части, но в этом случае оно выйдет после изменения первого подходящего «Jack».

PS, я обнаружил, что sed faq очень полезен в подобных случаях.

...