В файле экспорта, содержащем более 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
Вы можете помочь мне?
@ikegami Можете ли вы рассказать поподробнее? Какими инструментами и примером для моего конкретного случая? Я был бы благодарен.
пожалуйста, обновите вопрос, чтобы показать ожидаемый результат для той же строки ICON = "...."
@markp-fuso, атрибуты нужно удалить.
Да, я хочу заменить весь этот раздел ничем, как я сказал выше, без достаточного комментария, например: sed -e 's/^text to find, начиная с ICON, чтобы удалить "$//g', за исключением того, что этот текст довольно специфический.
прочитайте определение синтаксиса регулярного выражения sed. Вы пытаетесь использовать синтаксис, отличный от sed.
ваш второй sed может работать, но согласно вашему связанному тесту regex101 ваши данные не начинаются ICON и не привязаны к началу (^) и концу ($) строки





Предположения:
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 работает очень хорошо. После нескольких проверок все мои закладки без ошибок импортировались в Буку. Спасибо за вашу эффективную помощь.
Что касается вашего кода 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)
Используйте инструмент, предназначенный для HTML