Náhrada kódu v bashi nefunguje

Náhrada kódu v bashi nefunguje
« kdy: 27. 06. 2023, 16:49:12 »
Kdo používáte chatGPT, řeším následující problém. Zkopíruju diskusi z html stránky ve Firefoxu, vložím to do WYSIWIG editoru na blogspot.com . Odstranit fotky u hlavičky zpráv uživatele, případně to nahradit za jiný kód. Nyní zkouším 1) najít html kód - funguje 2) odstranit html kód - nefunguje.

Takže na blogspotu přepnu na html pohled, označím všechen kód s tagama, zkopíruji to do souboru puvodni_kod.html . Následně si najdu značky s obrázkem, který je zabalený ve wrapperu...

hledaný kód začíná takto:
Kód: [Vybrat]
</div></div></div><span class="flex-grow flex-shrink-0" style="font-family: arial;"></span><div class="flex p-4 gap-4 text-base md:gap-6 md:max-w-2xl lg:max-w-[38rem] xl:max-w-3xl md:py-6 lg:px-0 m-auto"><div class="flex-shrink-0 flex flex-col relative items-end"><div class="w-[30px]"><div class="relative flex"><span style="background: none; border: 0px none; box-sizing: border-box; display: inline-block; font-family: arial; height: initial; margin: 0px; max-width: 100%; opacity: 1; overflow: hidden; padding: 0px; position: relative; width: initial;"><span style="background: none; border: 0px none; box-sizing: border-box; display: block; height: initial; margin: 0px; max-width: 100%; opacity: 1; padding: 0px; width: initial;"><img alt="" aria-hidden="true" src="data:image/a končí takto:
Kód: [Vybrat]
.png&amp;w=96&amp;q=75" style="border: medium none; box-sizing: border-box; display: block; height: 0px; inset: 0px; margin: auto; max-height: 100%; max-width: 100%; min-height: 100%; min-width: 100%; padding: 0px; position: absolute; width: 0px;" /></span></div></div></div><div class="relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex items-start overflow-x-auto whitespace-pre-wrap break-words flex-col gap-4"><div class="empty:hidden">
Vložím to do souboru tags_to_remove_from_code.txt

Spustím skript remove-user-wrapper.sh
Kód: [Vybrat]
#!/bin/bash

# Název souboru
input_filename="puvodni_kod.html"
output_filename="novy_kod.html"

# Načtení obsahu souboru
file_content=$(cat "$input_filename")

# Řetězec s HTML tagy ke odstranění
# Při načítání obsahu ze souboru pomocí $(< "$input_filename") nemusíte escapovat uvozovky v textu. Tento způsob načítání souboru v shell skriptu umožňuje zachovat původní formátování a speciální znaky v textu bez potřeby escapování. Stejně tak při načítání řetězce ke odstranění pomocí $(< "hledany_kod.txt") nemusíte escapovat uvozovky ani jiné speciální znaky, pokud jsou přítomny v textu v souboru "hledany_kod.txt".
string_to_remove=$(< "tags_to_remove_from_code.txt")
# Přesto nebyl nahrazen a chatGPT přesto píše že mám escapovat speciální znaky [ ] \ . * ^ $
escaped_search_pattern=$(sed 's/[][\\.*^$]/\\&/g' <<< "$search_pattern")

if [[ $file_content =~ $escaped_search_pattern ]]; then
  echo "Výraz byl nalezen."
else
  echo "Výraz nebyl nalezen."
  exit
fi

# Odstranění řetězce ze souboru
# 2x slash // znamená, že se bude opakovat hledání na všechny
new_content="${file_content//$string_to_remove/}"
# #*</div></div></div> ...  odstraň nejdelší shodujícího se vzoru ze začátku řetězce
string_to_remove="${string_to_remove#*</div></div></div>}"
# Odstranění počátečního řetězce ze souboru
new_content="${file_content/$string_to_remove/}"

# Přepsání souboru s novým obsahem
echo "$new_content" > "$output_filename"

Kód: [Vybrat]
$ ./remove-user-wrapper.sh
Výraz byl nalezen a provedla se záměna.

Ale v nově vytvořeném či přepsaném souboru novy_kod.html stále vidím ten řetězec který měl být odstraněn. Víte v čem může být problém? V případě, že byste přišli na to jak provést tu záměnu a odstranění, pak budu řešit jak to nahradit za jiný kód (například nadpis s popiskem User:)

PS: Soubor jsem vytvořil v nano, myslím, že kódování a BOM snad v tom roli nehraje. Je to na linuxu.
« Poslední změna: 27. 06. 2023, 16:55:21 od Petr Krčmář »


Wolda

  • **
  • 79
  • http://honza.ucw.cz
    • Zobrazit profil
    • E-mail
Re:Náhrada kódu v bashi nefunguje
« Odpověď #1 kdy: 27. 06. 2023, 21:03:26 »
Kdo/kdy/cim naplnil promennou search_pattern, nez byla pouzita na radku zacinajicim escaped_search_pattern= ?

Re:Náhrada kódu v bashi nefunguje
« Odpověď #2 kdy: 27. 06. 2023, 21:23:21 »
Děkuji. A ještě mám dotaz. Je v linuxu nějaký program pokud možno z terminálu který by mi mohl daný skript (obvykle bash, ale někdy zkouším perl nebo python ) zkontrolovat a upozornit mě na takové chyby? U toho chatGPT se to snadno stane, on jak radí, tak změní název proměnné.
« Poslední změna: 27. 06. 2023, 21:24:59 od exkalibr »

vcunat

  • ***
  • 129
    • Zobrazit profil
    • E-mail
Re:Náhrada kódu v bashi nefunguje
« Odpověď #3 kdy: 27. 06. 2023, 21:39:00 »
Nevím jestli tuhle chybu, ale shellcheck.net existuje.

A mimochodem hack-parsovaní html/xml nějakými regulárními výrazy mi přijde jako fuj.  Jo, na většině vstupů to projde, ale hnus.  Záleží co člověk chce.  Pořádně se takové věci dají dělat třeba s xsltproc myslím, nebo prostě něčím jiným co to korektně naparsuje.

Re:Náhrada kódu v bashi nefunguje
« Odpověď #4 kdy: 27. 06. 2023, 21:49:18 »
xsltproc jsem nikdy nezkoušel, slyším poprvé.

Opravený kod:

Kód: [Vybrat]
#!/bin/bash

# Název souboru
input_filename="puvodni_kod.html"
output_filename="novy_kod.html"

# Načtení obsahu souboru
file_content=$(cat "$input_filename")

# Řetězec s HTML tagy k odstranění
string_to_remove=$(< "tags_to_remove_from_code.txt")
# escapovat speciální znaky  [ ] ( ) \ . * ? ^ $ " & +
escaped_string_to_remove=$(sed 's/[][()\\.*?^$"&+]/\\&/g' <<< "$string_to_remove")

if [[ $file_content =~ $escaped_string_to_remove ]]; then
  echo "Výraz byl nalezen."
else
  echo "Výraz nebyl nalezen."
  exit
fi

echo "PRVNÍ VZOR: $escaped_string_to_remove"

# Odstranění řetězce ze souboru
# 2x slash // znamená, že se bude opakovat hledání na všechny
new_content="${file_content//$escaped_string_to_remove/}"
# #*</div></div></div> ...  odstraň nejdelší shodujícího se vzor ze začátku řetězce

new_escaped_string_to_remove="${escaped_string_to_remove#*</div></div></div>}"
echo "DRUHÝ VZOR: $new_escaped_string_to_remove"

# Odstranění počátečního řetězce ze souboru
new_content="${new_content/$new_escaped_string_to_remove/}"

# Přepsání souboru s novým obsahem
echo "$new_content" > "$output_filename"