evaeden
Goto Top

Textblock kopieren

Liebe User,

ich möchte gerne den Header einer .htm Datei kopieren. Also alle Zeilen vom Anfang einer Textdatei bis zum Suchwort "</head>" in eine andere Datei kopieren. Leider unterstützt z.B. "split" kein Aufteilen von Dateien bis "Suchwort". Oder kennt Ihr noch andere Tools oder evtl. eine Batch-Lösung? Das Problem ist nur dass sich z.B. die Sonderzeichen ">" und "<", die ja in HTML-Code vorkommen, nicht so ohne weiteres in Batch verarbeiten lassen (echo <HEAD> >> out.txt).

Dankeschön fielmahls, Gruss & Kuss, die Haselnuss~
<°)))><

Content-Key: 189084

Url: https://administrator.de/contentid/189084

Printed on: April 25, 2024 at 09:04 o'clock

Member: bastla
bastla Aug 03, 2012 updated at 14:38:15 (UTC)
Goto Top
Hallo EvaEden und willkommen im Forum!
Problem ist nur dass sich z.B. die Sonderzeichen ">" und "<", die ja in HTML-Code vorkommen, nicht so ohne weiteres in Batch verarbeiten lassen (echo <HEAD> >> out.txt).
Eigentlich nicht - aber Zeilen, die eine ungerade Anzahl von Anführungszeichen enthalten, lassen den folgenden Batch entgleisen (zumindest, wenn sie sich im <Head>-Teil befinden):
@echo off & setlocal
set "Ein=D:\Deine.html"  
set "Aus=D:\Header.html"  
set "Bis=</head>"  

set "Suche=%Bis:<=\<%"  
set "Suche=%Suche:>=\>%"  
del "%Aus%" 2>nul  
set "Fertig="  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do if not defined Fertig (  
    set "Zeile=%%j"  
    call :ProcessLine
)
goto :eof

:ProcessLine
echo "%Zeile%"|findstr /i "%Suche%">nul || goto :Ausgabe  
set "Fertig=True"  
call set "Teil=%%Zeile:*%Bis%=%%"  
call set "Zeile=%%Zeile:%Teil%=%%"  
:Ausgabe
setlocal enabledelayedexpansion
>>"%Aus%" echo(!Zeile!  
endlocal
goto :eof
- daher im Zweifelsfall eher VBS:
Ein = "D:\Deine.html"  
Aus = "D:\Header.html"  
Bis = "</head>"  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = fso.OpenTextFile(Ein).ReadAll
P = InStr(1, T, Bis, vbTextCompare)
If P = 0 Then
    WScript.Echo "'" & Bis & "' konnte nicht gefunden werden!"  
    WScript.Quit 1
End If
fso.CreateTextFile(Aus).Write Left(T, P - 1 + Len(Bis))
Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Aug 03, 2012, updated at Aug 05, 2012 at 09:35:17 (UTC)
Goto Top
moin bastla,

wenn der Baztch nicht grätschen soll dann eventuell so:

@echo off
setlocal disabledelayedexpansion
set "Ein=D:\Deine.html"  
set "Aus=D:\Header.html"  
set "Bis=</head>"  

find /n /v "" <"%Ein%">"%temp%\tmpln.txt"  
set "Fertig ="  
3>"%Aus%" (  
for /f "usebackqtokens=1* delims=]" %%i in ("%temp%\tmpln.txt") do if not defined Fertig (   
    set "Zeile=%%j"  
    call :ProcessLine
)
)
goto :eof

:ProcessLine
(cmd /von /c echo !Zeile!)|find /i "%Bis%">nul || goto :Ausgabe  
set "Fertig=True"  
setlocal enabledelayedexpansion
set "Teil=!Zeile:*%Bis%=!"  
if defined Teil set "Zeile=!Zeile:%Teil%=!"  
:Ausgabe
if %os% neq !os! setlocal enabledelayedexpansion
>&3 echo(!Zeile!
goto :eof

[Edit]
Code angepasst
[/Edit]

Gruß Phil
Member: bastla
bastla Aug 03, 2012 at 20:18:04 (UTC)
Goto Top
Hallo PH!

Die gute Nachricht: grätscht nicht ... face-wink

Die schlechte Nachricht siehst Du selbst, wenn Du testest (und damit sind nicht nur ev Leerzeilen gemeint) ...

Grüße
bastla
Member: EvaEden
EvaEden Aug 05, 2012 at 07:50:29 (UTC)
Goto Top
Vielen vielen Dank für Eure Lösungen!
So in etwa hatte ich es mir auch vorgestellt. Nur leider scheitert das meist schon am ersten "<!DOCTYPE...".
Deswegen war ich auf der Suche nach externen (GNU-)Tools, die mir eben den gesamten Block bis Suchwort herauskopieren o.ä.
Herzliche Grüßlinge & take care
Member: bastla
bastla Aug 05, 2012 at 09:08:48 (UTC)
Goto Top
Hallo EvaEden!
Nur leider scheitert das meist schon am ersten "<!DOCTYPE...".
Das kann ich mir jedenfalls hinsichtlich der VBS-Variante überhaupt nicht vorstellen, und was den Batch angeht, sollte es eigentlich, wie oben angemerkt, auch nur dann nicht funktionieren, wenn eine Zeile eine ungerade Anzahl von Anführungszeichen enthält ...

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Aug 05, 2012 updated at 09:54:36 (UTC)
Goto Top
moin,

da muss ich bastla recht geben.
also ich kann das mit dem geraden oder ungeraden Anführungsziechen gar nicht nachvollziehen.
Es kommt immer die Zeile Korrekt raus, egal wieviele bzw wo die Sonderzeichen stecken.

selbst als oneliner im CMD Fenster gehts richtig.

Den Code habe ich oben angepasst.

Gruß Phil
Mitglied: 76109
76109 Aug 05, 2012 at 10:15:12 (UTC)
Goto Top
Hallo zusammen!

Leider unterstützt z.B. "split" kein Aufteilen von Dateien bis "Suchwort".
Stellt sich eventuell die Frage, welches Textformat die Html-Dateien haben (Ansi, Unicode, UTFx..)?

Gruß Dieter
Member: pieh-ejdsch
pieh-ejdsch Aug 05, 2012 at 14:32:48 (UTC)
Goto Top
moin,

Zitat von @EvaEden:
Deswegen war ich auf der Suche nach externen (GNU-)Tools, die mir eben den gesamten Block bis Suchwort herauskopieren o.ä.

Dann hab ich mal einen kleinen Split per Batch hier, damit der HTML als ganzes wiederkömmt.

@echo off

setlocal disabledelayedexpansion
set "Ein=D:\Deine.html"  
set "Aus=D:\Header.html"  
set "Bis=</head>"  

call :In <"%Ein%" >"%aus%"  
goto :eof

:In
set /p "Zeile="  
(cmd /von /c echo(!Zeile!)|find "%Bis%" >nul ||(cmd /von /c "<nul set /p "=!Zeile!" "& goto :in )  
setlocal enabledelayedexpansion
set "Zeile=!Zeile:%Bis%=%Bis%\:!"  
:End
if !Zeile:~-1! neq \ set "Zeile=!Zeile:~0,-1!" &goto :end  
echo !Zeile:\=!
exit /b
^

Gruß Phil
Member: bastla
bastla Aug 05, 2012 at 18:27:35 (UTC)
Goto Top
Hallo PH!

Das tut face-smile - und Zeilenumbrüche/Leerzeilen braucht man(n) in HTML ja ohnehin nicht wirklich face-wink ...

Grüße
bastla
Member: EvaEden
EvaEden Aug 10, 2012 at 08:02:53 (UTC)
Goto Top
Vielen Dank Jungs!

ich habe jetzt eine schnellere Lösung gefunden:

sed "/<\/head/Iq" Deine.html>Header.html

http://gnuwin32.sourceforge.net/packages/sed.htm

Herzlichst, Eva~