Sed: вставить строку в определенную позицию

Я просто смотрел вокруг, но я не нашел ничего, что сработало бы для меня. Я хотел бы вставить новую строку (в основном строку таблицы html) поверх других строк.

<table id="tfhover" class="tftable" border="1">
<tr><th>HEADER1</th><th>HEADER2</th><th>HEADER3</th><th>HEADER4</th></tr>
<tr><td>Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td></tr>
</table>

Итак, есть ли кто-нибудь, кто может предложить мне sed cmd, который добавит новое:

<tr><td>Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td>

чуть ниже HEADERS?

Спасибо!

Ответ 1

Итак, для начала у нас есть файл со следующими строками, называемый datafile.txt

1 some test lines here
but not all lines contain nubers
3 and here is the last one

и у нас есть одна переменная bash $ADDED с содержимым строки, которое нужно добавить

ADDED="==This is the new line=="

Итак, добавьте строку после первой строки

ADDED="==This is the new line=="
< datafile.txt sed "1a \\
$ADDED
"

результат:

1 some test lines here
==This is the new line==
but not all lines contain nubers
3 and here is the last line

Добавить строку после всех строк, которые начинаются с числа

< datafile.txt sed "/^[0-9]/a \\
$ADDED
"

результат:

1 some test lines here
==This is the new line==
but not all lines contain nubers
3 and here is the last line
==This is the new line==

Добавьте строку в начало, поэтому вставьте перед первой строкой

< datafile.txt sed "1i \\
$ADDED
"

результат

==This is the new line==
1 some test lines here
but not all lines contain nubers
3 and here is the last line

Вы можете "подставить" конец строки для добавления нового

< datafile.txt sed "/all/s/$/\\
$ADDED/"

в приведенном выше примере добавьте строку после строки, которая содержит слово "все", подстановкой

1 some test lines here
but not all lines contain nubers
==This is the new line==
3 and here is the last line

Вы можете даже разделить строку и добавить между

< datafile.txt sed "/all/s/\(.*lines \)\(.*\)/\1\\
$ADDED\\
\2/"

выше будет искать строку, содержащую слово "все", и разбить ее после слова "линии". Результат:

1 some test lines here
but not all lines 
==This is the new line==
contain nubers
3 and here is the last line

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

НО, это не значит, что невозможно сопоставить некоторые части файлов HTML. Если вы знаете, что хотите соответствовать (а не анализировать), вы можете безопасно использовать регулярное выражение для HTML. Просто многие люди здесь не знают разницы между синтаксическим разбором и сопоставлением.

Итак, если ваши html файлы имеют хорошо известную структуру, например. вы уверены, что ваш html будет все вышеперечисленной структурой, вы можете спокойно писать:

<your_file.html sed "/^<tr><th>/a \\
<tr><td>new Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td>
"

и вы получите

<table id="tfhover" class="tftable" border="1">
<tr><th>HEADER1</th><th>HEADER2</th><th>HEADER3</th><th>HEADER4</th></tr>
<tr><td>new Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td>
<tr><td>Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td></tr>
</table>

просто потому, что мы НЕ ПОВТОРЯЕМ HTML-код, мы только СОХРАНЯЕМ некоторые шаблоны строк.