Замените ссылку ICON ничем

В файле экспорта, содержащем более 2600 закладок из Firefox, я хочу импортировать их в Buku, который, похоже, содержит ошибку со значком в html-файле. Поэтому я хочу заменить ссылку ICON ничем. Вот пример, самый короткий:

ICON = "data:image/png;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNic+IDxwYXRoIGQ9J00wIDBoMTZ2MTZIMHonLz4gPHBhdGggZD0nTTEzLjk5NCAxMC4zNTZIMTVWMTJoLTMuMTcxVjcuNzQxYzAtMS4zMDgtLjQzNS0xLjgxLTEuMjktMS44MS0xLjA0IDAtMS40Ni43MzctMS40NiAxLjh2Mi42M2gxLjAwNlYxMkg2LjkxOFY3Ljc0MWMwLTEuMzA4LS40MzUtMS44MS0xLjI5MS0xLjgxLTEuMDM5IDAtMS40NTkuNzM3LTEuNDU5IDEuOHYyLjYzaDEuNDQxVjEySDF2LTEuNjQ0aDEuMDA2VjYuMDc5SDFWNC40MzVoMy4xNjh2MS4xMzlhMi41MDcgMi41MDcgMCAwIDEgMi4zLTEuMjlBMi40NTIgMi40NTIgMCAwIDEgOC45MzEgNS45MSAyLjUzNSAyLjUzNSAwIDAgMSAxMS40IDQuMjg0IDIuNDQ4IDIuNDQ4IDAgMCAxIDE0IDYuOXYzLjQ1OHonIGZpbGw9JyNmZmYnLz4gPC9zdmc+"

я пробовал

sed -e 's/^ICON=\"data:image/png;base64,^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$\"$//g' firefox_bookmarks_copie.html > test1.html

sed -e 's/^ICON = "[[:print:]]"$//gi' firefox_bookmarks_copie.html > test2.html

sed -e 's/^ICON = "data:image(/[^;]+;base64[^"]+)"$//g' firefox_bookmarks_copie.html > test3.html

awk '{gsub(/^ICON = "[:print:]"$/,"");}' firefox_bookmarks_copie.html > copie4.html

Кажется, AWK вызывает у меня проблемы при сохранении в copy4.html.

perl -0pe 's/^ICON = "data:image(/[^;]+;base64[^"]+)"$//' firefox_bookmarks_copie.html >> copie5.html

Сайт https://regex101.com/r/sxFswz/1, кажется, сообщает мне, что моя замена REGEX эффективна с

/ICON = "data:image(/[^;]+;base64[^"]+)"/g

Вы можете помочь мне?

Используйте инструмент, предназначенный для HTML

ikegami 15.04.2024 20:29

@ikegami Можете ли вы рассказать поподробнее? Какими инструментами и примером для моего конкретного случая? Я был бы благодарен.

Boulou 15.04.2024 20:37

пожалуйста, обновите вопрос, чтобы показать ожидаемый результат для той же строки ICON = "...."

markp-fuso 15.04.2024 20:45

@markp-fuso, атрибуты нужно удалить.

ikegami 15.04.2024 20:54

Да, я хочу заменить весь этот раздел ничем, как я сказал выше, без достаточного комментария, например: sed -e 's/^text to find, начиная с ICON, чтобы удалить "$//g', за исключением того, что этот текст довольно специфический.

Boulou 15.04.2024 21:19

прочитайте определение синтаксиса регулярного выражения sed. Вы пытаетесь использовать синтаксис, отличный от sed.

jhnc 15.04.2024 23:10

ваш второй sed может работать, но согласно вашему связанному тесту regex101 ваши данные не начинаются ICON и не привязаны к началу (^) и концу ($) строки

jhnc 15.04.2024 23:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предположения:

  • ОП хочет удалить ВСЕ строки ICON = "..." из html-файла

Использование следующего (сильно) измененного примера HTML-файла для демонстрационных целей:

$ cat bm.html
<!DOCTYPE html>
<html>
  <head>
... some other stuff ...
  </head>
  <body>
... some other stuff ...
      <DT><A HREF = "https://www.inter.net/search/results/content/?abc" ICON = "data:image/png;base64,PHN2ZyB...snip_#1...z4gPC9zdmc+">some description</A>
                                                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      <DT><A HREF = "https://www.inter.net/search/results/content/?abc" ICON = "data:image/png;base64,PHN2ZyB...snip_#2...z4gPC9zdmc+">some description</A>
                                                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  </body>
</html>

ПРИМЕЧАНИЕ. Строки ^^^^^^^^^^^^^^ не существуют в bm.html, но они добавлены сюда, чтобы выделить строки, которые мы ищем.

Общий подход - ищите последовательные строки a) ICON = ", b) [^"]* (строка, не содержащая двойных кавычек) и c) "

Одна sed идея:

$ sed 's/ICON = "[^"]*"//g' bm.html
<!DOCTYPE html>
<html>
  <head>
... some other stuff ...
  </head>
  <body>
... some other stuff ...
      <DT><A HREF = "https://www.inter.net/search/results/content/?abc" >some description</A>
      <DT><A HREF = "https://www.inter.net/search/results/content/?abc" >some description</A>
  </body>
</html>

Одна awk идея:

$ awk '{gsub(/ICON = "[^"]+"/,"")}1' bm.html
<!DOCTYPE html>
<html>
  <head>
... some other stuff ...
  </head>
  <body>
... some other stuff ...
      <DT><A HREF = "https://www.inter.net/search/results/content/?abc" >some description</A>
      <DT><A HREF = "https://www.inter.net/search/results/content/?abc" >some description</A>
  </body>
</html>

ПРИМЕЧАНИЕ. Для этого конкретного html-файла глобальные параметры g (sed + /g; awk + gsub() (в отличие от sub()) являются излишними, поскольку в каждой строке есть только одно совпадение; если переводы строк должны быть удалены (таким образом, остается одна длинная строка данных ) параметры global обеспечивают замену всех совпадений ICON = "..." в одной строке.

Версия awk работает очень хорошо. После нескольких проверок все мои закладки без ошибок импортировались в Буку. Спасибо за вашу эффективную помощь.

Boulou 16.04.2024 02:50

Что касается вашего кода AWK

awk '{gsub(/^ICON = "[:print:]"$/,"");}' firefox_bookmarks_copie.html > copie4.html

есть как минимум 3 ошибки.

Из Руководство пользователя GNU Awk

Класс символов действителен только в регулярном выражении внутри скобок. выражение в скобках.

поэтому [:print:] должно быть внутри [ и ], простой пример

echo "ABC" | awk '/[:print:]/' # no output
echo "ABC" | awk '/[[:print:]]/'  # output is ABC

после устранения этой проблемы результат

awk '{gsub(/^ICON = "[[:print:]]"$/,"");}' firefox_bookmarks_copie.html > copie4.html

что приведет к созданию пустого файла, поскольку вы не можете указать GNU AWK на print измененную строку, по логике это должно быть после изменения, которое

awk '{gsub(/^ICON = "[[:print:]]"$/,"");print}' firefox_bookmarks_copie.html > copie4.html

Однако теперь это будет нацелено только на ICON с односимвольным значением, то есть для хранения входного файла.

STUFF
ICON = "A"
ICON = "ABC"
STUFF

дал бы результат

STUFF

ICON = "ABC"
STUFF

для таргетинга на многосимвольные значения вы также можете использовать + (один или несколько) следующим образом

awk '{gsub(/^ICON = "[[:print:]]+"$/,"");print}' firefox_bookmarks_copie.html > copie4.html

Предполагается, что ICON = "..." охватывает всю строку, я не знаю, можно ли так предположить, не просматривая нотацию EBNF, описывающую, что может быть в файлах, которые вы обрабатываете.

(проверено в GNU Awk 5.1.0)

Другие вопросы по теме