Используйте SED или AWK, чтобы найти и заменить строку в нескольких строках - PullRequest
1 голос
/ 15 февраля 2020

У меня есть файл HTML, который содержит строку в одну строку, которую я хотел бы переместить на другую строку после строки.

Команда должна учитывать вариации первой строки в документе.

Я пробовал следующее с Sed, но они не работают:

sed 's/\(aria-describedby="page-[0-9]"\)\(.*<aside \)/\2\1/g'

и

 sed 's/\(aria-describedby="page-[0-9]"\)\(.*<aside \)/\2\1/g'

Строка, которую я хотел бы найти, - aria-describedby="page-foo", и я хотел бы переместить эту строку после строк, начинающихся с <aside до следующего экземпляра aria-describedby="page-foo".

Ввод:

<h6 aria-describedby="page-1" id="page-1">Page 1</h6>
<h1 id="chapter-1">Chapter 1</h1>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<h2 id="math-content">Math Content</h2>
<p><span class="math display">\[\sqrt{a^{2} + b^{2}}\]</span></p>
<p>This is a paragraph</p>
<aside role="doc-footnote">
<p>This is a paragraph</p>
<p>This is a paragraph</p>
</aside>
<aside role="complementary">
<p>Secondary Text Begin:</p>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<p>Secondary Text End</p>
</aside>
<h6 aria-describedby="page-2" id="page-2">Page 2</h6>
<h1 id="chapter-2">Chapter 2</h1>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<h2 id="math-content">Math Content</h2>
<p><span class="math display">\[\sqrt{a^{2} + b^{2}}\]</span></p>
<p>This is a paragraph</p>
<aside role="doc-footnote">
<p>This is a paragraph</p>
<p>This is a paragraph</p>
</aside>
<aside role="complementary">
<p>Secondary Text Begin:</p>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<p>Secondary Text End</p>
</aside>

Желаемый вывод:

<h6 id="page-1">Page 1</h6>
<h1 id="chapter-1">Chapter 1</h1>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<h2 id="math-content">Math Content</h2>
<p><span class="math display">\[\sqrt{a^{2} + b^{2}}\]</span></p>
<p>This is a paragraph</p>
<aside aria-describedby="page-1" role="doc-footnote">
<p>This is a paragraph</p>
<p>This is a paragraph</p>
</aside>
<aside aria-describedby="page-1" role="complementary">
<p>Secondary Text Begin:</p>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<p>Secondary Text End</p>
</aside>
<h6 id="page-2">Page 2</h6>
<h1 id="chapter-2">Chapter 2</h1>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<h2 id="math-content">Math Content</h2>
<p><span class="math display">\[\sqrt{a^{2} + b^{2}}\]</span></p>
<p>This is a paragraph</p>
<aside aria-describedby="page-2" role="doc-footnote">
<p>This is a paragraph</p>
<p>This is a paragraph</p>
</aside>
<aside aria-describedby="page-2" role="complementary">
<p>Secondary Text Begin:</p>
<p>This is a paragraph</p>
<p>This is a paragraph</p>
<p>Secondary Text End</p>
</aside>

1 Ответ

1 голос
/ 15 февраля 2020

По вашему описанию работает следующее:

sed '
/aria-describedby="page-/{
h
s/.*\( aria-describedby="page-[0-9]*"\).*/\1/
x
s/ aria-describedby="page-[0-9]*"//
}
/aside role="\(doc-footnote\|complementary\)"/{
G
s/aside\(.*\)\n\(.*\)/aside\2\1/
}' yourfile

Как это работает:

  • для каждой подходящей строки aria-describedby="page- делает то, что в {…}:
    • h "сохраняет" строку в том виде, в каком она есть сейчас, копируя ее в пространство удержания ( перезаписывая все, что находится в пространстве удержания )
    • s удаляет то, что до и после aria-describedby="page-n" (n - число; начальный пробел оставлен!)
    • x свопы для удержания и пробелы: пробел содержит отредактированную строку, пробел для оригинала строка, которую мы сохранили с помощью h
    • s, теперь удаляет aria-describedby="page-n
  • при попадании на строку, соответствующую aside role="doc-footnote" или aside role="complementary", делается следующее:
    • G добавляет содержимое пространства шаблона к текущей строке, с \n между
    • s переупорядочивает фигуры при удалении \n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...