Avatar billede visto Guru
17. december 2011 - 12:34 Der er 15 kommentarer og
1 løsning

Search/replace på baggrund af mønster

Jeg har en masse filer, hvor jeg ønsker at erstatte
<div class="boks">Sidens overskrift</div>
med
<div class="boks"><h1>Sidens oerskrift</h1></div>
hvor "Sidens overskrift" er forskellig på alle de pågældende sider.

Findes der et program (helst freeware), der kan foretage en sådan søg-erstat helst også i undermapper i ét hug?
Avatar billede visto Guru
17. december 2011 - 13:03 #1
Glemte lige: Den kode der skal erstattes befinder sig nogle gange over flere linjer, så det skal programmet også kunne klare.
Avatar billede Slettet bruger
17. december 2011 - 14:43 #2
I Eclipse kan det gøres med Find/Replace, hvor der er sat flueben i "Regular expression".
Find: <div class="boks">((\R|.*?)*)</div>
Replace with: <div class="boks"><h1>$1</h1></div>
Avatar billede visto Guru
17. december 2011 - 16:42 #3
http://www.eclipse.org/downloads/ er der 11 forskellige programmer der kan downloades, prøvede Eclipse Classic, men det var tilsyneladende ikke den. Hvilket program drejer det sig om?

Jeg har også nogle Søg-erstat muligheder i Notepad++, hvor der også var valgmuligheden Regulært udtryk, hvilket fik mig til at tænke på om Notepad++ måske også kan klare det? Prøvede med Find: <div class="boks">((\R|.*?)*)</div>
Replace with: <div class="boks"><h1>$1</h1></div>
men det duede ikke, så "opskriften" må i givet fald være en anden.
Avatar billede Slettet bruger
17. december 2011 - 20:38 #4
Jeg tror det er ligegyldigt hvilken Eclipse du bruger. Jeg har prøvet med classic versionen, og der fungerer det også. Edit->Find/Replace kan vist kun bruges til at søge/erstatte i den fil du har åben. Hvis du vil have det gjort med f.eks. et helt projekt, så markerer du projektet og åbner Search->File Search hvor du udfylder
1) Containing text: <div class="boks">((\R|.*?)*)</div>
2) Flueben i Regular expression
3) File name patterns: * (her kan du evt. begrænse søgning til f.eks. *.html filer)
4) Replace knappen: nyt vindue åbner hvor du udfylder With: <div class="boks"><h1>$1</h1></div>

Med Notepad++ skal du muligvis hente et plugin der kan lave søgninger med linieskift (så vidt jeg kunne læse mig frem til). Hvis der ikke skulle tages højde for linieskift, kunne du bruge:
Find what: <div class="boks">(.*?)</div>
Replace with: <div class="boks"><h1>\1</h1></div>
Search mode: Regular expression

Bemærk, eclipse bruger $1 mens notepad++ bruger \1
Avatar billede Slettet bruger
17. december 2011 - 20:44 #5
\R fortolkes i øvrigt af eclipse som et platformsuafhængigt linieskift, dvs. den virker for \r\n, \r og \n, og det er ikke sikkert det virker i andre programmer. Men du kan ændre det til:
<div class="boks">((\r\n|\r|\n|.*?)*)</div>
Avatar billede visto Guru
17. december 2011 - 21:20 #6
Jeg ved ikke om vi sidder med to forskellige versioner af programmet (mit hedder Eclipse SDK version 3.7.1), men når jeg trykker på Replaceknappen (efter dine første tre punkter (hvor jeg ikke foretager nogen begrænsning under 3)) åbner der ikke noget nyt vindue, men en process køres lynhurtigt, hvor jeg får en dialogboks med beskeden "No matches to replace".
Forinden har jeg som Workspace valgt den mappe, som indeholder de testfiler, jeg vil prøve at lave operationen på.

Kan du hjælpe mig videre?
Avatar billede Slettet bruger
17. december 2011 - 22:08 #7
Jeg har prøvet med en frisk version af Eclipse Classic 3.7.1 jeg lige har downloadet og uden at ændre på nogle indstillinger overhovedet. Jeg har lavet nogle screenshots så du kan se om det er det samme vi ser. Den viser 4 screenshots i det samme billede:

http://img707.imageshack.us/img707/7931/testib.jpg

1) 2 filer med den samme tekst (dvs. begge filer med en div uden linieskift og en med linieskift).
2) Menuen "Search->File..." med de indstillinger jeg har sat.
3) Vinduet jeg får frem når jeg klikker "Replace..."
4) Resultatet af min search og replace (som opdaterede begge html filer).
Avatar billede Slettet bruger
17. december 2011 - 22:18 #8
Måske er det den måde du har lavet dit workspace på der giver dig problemer. Dit workspace er der hvor alle dine projekter ligger. Så din filstruktur vil se således ud (hvis vi antager du har valgt dit workspace skal ligge under C:\workspace):
C:\workspace\projekt1
C:\workspace\projekt2
osv.
Så hvis du har dine filer liggende i projekt1, så skal du i dit workspace oprette et nyt projekt i eclipse som du også kalder projekt1. Det gør du f.eks. på denne måde:
1) File->New->Project...
2) Vælg General->Project
3) Project name: projekt1
4) Finish
Avatar billede visto Guru
18. december 2011 - 10:56 #9
Bingo. Så lykkedes det. Dog mangler der en enkelt ting. Den replacer kun koden, når den står i én linje, rører ikke ved de sider, hvor koden står som
<div class="boks">
Sidens oerskrift
</div>

Kan programmet klarer det også? Og hvis ikke sammen med den proces, der klarer en linje, så i en anden omgang, hvor flerlinjer-koden tages for sig. Det er klart at den første mulighed, hvor det hele klares på en gang, vil være at foretrække.
Avatar billede Slettet bruger
18. december 2011 - 12:46 #10
Den virker både med og uden linieskift i eclipse. Også med det eksempel du lige gav. Jeg har denne regex:
<div class="boks">((\R|.*?)*)</div>
Avatar billede visto Guru
18. december 2011 - 14:44 #11
Du har ret. Jeg ved ikke hvad der skete i mit første forsøg. Men alt virker som det skal.
Det vil virkelig spare mig for rigtig meget manuelt arbejde. Mange tak for rigtig god hjælp.
Læs venligst svar til point.
Avatar billede visto Guru
18. december 2011 - 16:36 #12
Første omgangs replace på alle filer gik som den skulle. Men da jeg herefter ville foretage en anden replacement i samme filer, fik jeg beskeden:
"The search could not be initialized - Reason: Problems encountered during text search"
Og videre under Details:
File 'filnavn.php' has been skipped, problems while reading 'filnavn.php'
Resource is out of sync with the file system: 'filnavn.php'

Hvad kan det skyldes? At jeg allerede har lavet en omgang replacement? Eller hvad? Og hvordan forholder jeg mig i praksis, så jeg kan komme videre med anden omgang?
Avatar billede visto Guru
18. december 2011 - 17:38 #13
Har muligvis selv fundet løsningen: Opdaterede projektet (F5), hvorefter det kørte.
Avatar billede Slettet bruger
18. december 2011 - 17:44 #14
Det skyldes at du har rettet i filerne, altså uden at bruge eclipse til det, og det gør heller ikke noget, du kan bare trykke på projektet og bagefter F5 for at refreshe filerne i eclipse.

Jeg samler ikke point, og så fik jeg endelig taget mig sammen til at finde ud af hvordan man laver søg og erstat med regex i eclipse. :)
Avatar billede Slettet bruger
18. december 2011 - 17:44 #15
Fint. :)
Avatar billede visto Guru
18. december 2011 - 17:57 #16
Så vil jeg afslutte med at gentage min tak for virkelig fin, vedholdende og hurtigt hjælp.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester