String ersetzen , Doppelpunkt und senkrechten Strich durch Unterstrich
Hallo Leute, wer hilft mir dabei Linux und Windows etwas näher zu bringen?
Hallo ,
folgende Problemstellung
Es wird mit mal mit Windows und mal mit Linux gearbeitet. Alle Dateien werden auf einem gemeinsamen FAT32 Laufwerk gespeichert.
Dabei kommen unter Linux häufig Dateinamen beim Abspeichern wie
Die Idee:
Man nimmt den vorgeschlagenen Dateinamen in die Zwischenablage, startet die cmd mittels Shortcut, filtert die Sonderzeichen aus (ersetzt sie durch Unterstriche), schickt den String wieder in die Zwischenablage und fügt den modifizierten Dateinamen in den "Speichern-unter-Dialog" ein.
Soweit, so gut.
Habe fuer Windows an einem Skript gebastelt,
welches folgende Zeichen ersetzt: "|" ; "?" u. "Leerzeichen" durch Unterstrich, ä,ö,ü,ß durch ae,oe,ue,ss .
Ist ein wenig zusammengefrickelt, weil ich manche Zeichen nur mit set und manche nur mit .vbs ersetzen konnte (alles Bausteine aus diesem Forum), aber soweit funktioniert es.
senkrechten_strich_ersetzen.cmd:
Ein P r o b l e m bereitet mir der "Doppelpunkt" bzw. der "senkrechte Strich".
Alleine vorkommend, liesse sich das ersetzen: äö|ü? wird zu aeoe_ue_ und äö:ü? wird zu aeoe_ue_ .
Doch es gelingt mir nicht, einen zu String bearbeiten , in dem neben dem Doppelpunkt ( auch ein senkrechter Strich (|) vorkommt, irgendwie stören sich die beiden Zeichen und man erhält meistens nur den unbearbeiteten String im Ergebnis.
Hat jemand sinnvolle Vorschläge oder sogar eine (optimierte) Lösung?
Das gleiche soll dann natürlich auch unter Linux mit Bash gemacht werden, aber so weit bin ich ja noch nicht ...(erst mal in Windows . . . bei Linux bin noch ganz neuer Neuling, obwohl ich da auch schon eine Vorstellung habe)
herzlich Grüße
FF
Hallo ,
folgende Problemstellung
Es wird mit mal mit Windows und mal mit Linux gearbeitet. Alle Dateien werden auf einem gemeinsamen FAT32 Laufwerk gespeichert.
Dabei kommen unter Linux häufig Dateinamen beim Abspeichern wie
"cmd: wie ersetzte ich sonderzeichen ? in strings | linux.com.html" vor.
Man nimmt den vorgeschlagenen Dateinamen in die Zwischenablage, startet die cmd mittels Shortcut, filtert die Sonderzeichen aus (ersetzt sie durch Unterstriche), schickt den String wieder in die Zwischenablage und fügt den modifizierten Dateinamen in den "Speichern-unter-Dialog" ein.
Soweit, so gut.
Habe fuer Windows an einem Skript gebastelt,
welches folgende Zeichen ersetzt: "|" ; "?" u. "Leerzeichen" durch Unterstrich, ä,ö,ü,ß durch ae,oe,ue,ss .
Ist ein wenig zusammengefrickelt, weil ich manche Zeichen nur mit set und manche nur mit .vbs ersetzen konnte (alles Bausteine aus diesem Forum), aber soweit funktioniert es.
if not exist senkrechten_strich_ersetzen.cmd goto error
@echo off &setlocal
echo ersetzt die Umlaute u. ß
rem Leerzeichen,senkrechtenStrich,FragezeichenimString
echo.
echo. verwendbar im Datei-aspeichern-Dialog
echo Diese Datei ist mit einem Short-Cut (zu) versehen !
rem benötigt die Datei : senkrechten_strich_ersetzen.cmd
set "ae=ae"
set "oe=oe"
set "ue=ue"
set "ß=ss"
set clip=
REM User Input
rem set /p "dat=Datei: "
sfk151.exe fromclip > ~~~.txt
for /F "delims=" %%i in (~~~.txt) do if not defined zeile set "zeile=%%i"
echo ZEILE ist %Zeile%
call senkrechten_strich_ersetzen.cmd
set line=%ZEILE%
REM Umleitung erfolgt in eine temporäre Datei
>"temp.txt~" (
REM Datei Zeile für Zeile abarbeiten.
REM FINDSTR sucht alle Zeilen, die einen Zeilenanfang haben (also alle)
REM und setzt eine Zeilennummer + Doppelpunkt davor um sicher zu
REM stellen, dass auch Leerzeilen verarbeitet werden.
rem for /f "delims=" %%i in ('findstr /n "^" "%dat%"') do (
REM String einer Variablen zuordnen.
rem set "line=%%i"
REM Verzögerte Variablenerweiterung einschalten.
setlocal enabledelayedexpansion
REM Zeilennummer und Doppelpunkt entfernen
set "line=!line:*:=!"
REM Prüfen, ob die Zeile leer ist.
if "!line!"=="" (
REM Wenn ja, Leerzeile ausgeben.
echo(
) else (
REM Wenn nein, Ersetzungen durchführen und Zeile ausgeben.
set "line=!line:ä=%Ae%!"
set "line=!line:ö=%Oe%!"
set "line=!line:ü=%ue%!"
set "line=!line:Ä=%Ae%!"
set "line=!line:Ö=%Oe%!"
set "line=!line:Ü=%Ue%!"
set "line=!line:ß=%ss%!"
rem ersetze Leerzeichen
set "line=!line: =_!%
rem wie ersetzt man "|" ? bsp.: set @FeldTrenner = geht nicht "<|>",'<|>', "^|"?
rem set "line=!line:'^|'=%_%!" ANTWORT - DURCH EIN vbs-Script
rem und wie ersetzt man den Doppelpunkt ??????
echo(!line:ß=%ss%!
)
REM Verzögerte Variablenerweiterung ausschalten.
endlocal
)
)
REM Originaldatei durch die temporäre Datei überschreiben.
rem move "temp.txt~" "%dat%"
move "temp.txt~" ERGEBNIS.~~~
for /F "delims=" %%x in (ERGEBNIS.~~~) do if not defined zeile set "neuezeile=%%x"
rem %neuezeile% |sfk151.exe toclip (ab ins clipboard)
CLIP < ERGEBNIS.~~~
del ERGEBNIS.~~~
del ~~~.txt
goto end
:error
cls
echo.
echo Die Datei
echo senkrechten_strich_ersetzen.cmd
echo wurde nicht gefunden.
echo.
echo Skript wird abgebrochen !
pause
goto end:
:end
senkrechten_strich_ersetzen.cmd:
rem ersetzt in einem String das | durch _
@echo off & setlocal
set "Datei=c:\mako\~~~.txt"
set R=%temp%\Replacer.vbs
>%R% echo Set fso=CreateObject("Scripting.FileSystemObject"): T=fso.OpenTextFile("%Datei%").ReadAll: fso.CreateTextFile("%Datei%",True).Write Replace(T,"|","_")
cscript //nologo %R%
set R=%temp%\Replacer.vbs
>%R% echo Set fso=CreateObject("Scripting.FileSystemObject"): T=fso.OpenTextFile("%Datei%").ReadAll: fso.CreateTextFile("%Datei%",True).Write Replace(T,"?","_")
cscript //nologo %R%
set R=%temp%\Replacer.vbs
Ein P r o b l e m bereitet mir der "Doppelpunkt" bzw. der "senkrechte Strich".
Alleine vorkommend, liesse sich das ersetzen: äö|ü? wird zu aeoe_ue_ und äö:ü? wird zu aeoe_ue_ .
Doch es gelingt mir nicht, einen zu String bearbeiten , in dem neben dem Doppelpunkt ( auch ein senkrechter Strich (|) vorkommt, irgendwie stören sich die beiden Zeichen und man erhält meistens nur den unbearbeiteten String im Ergebnis.
Hat jemand sinnvolle Vorschläge oder sogar eine (optimierte) Lösung?
Das gleiche soll dann natürlich auch unter Linux mit Bash gemacht werden, aber so weit bin ich ja noch nicht ...(erst mal in Windows . . . bei Linux bin noch ganz neuer Neuling, obwohl ich da auch schon eine Vorstellung habe)
herzlich Grüße
FF
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 203657
Url: https://administrator.de/contentid/203657
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
26 Kommentare
Neuester Kommentar
Für linux kann ich Dir schon mal den Tipp geben Dich mit mmv und tr zu beschäftigen.
Und du könntest unter windows einfach die bash nehmen, ggf sogar zusammen mit cygwin um eine komplette Unix-Umgebung zu haben. Dann gehen solche Sachen viel einfacher zu machen.
lks
Nachtrag:
Für die Umlaute kannst Du sed benutzen, wenn Du nicht einfach nur die Doppelpunkte mit tr entfernen willst:
echo 'cmd: wie ersetzte ich sonderzeichen ? in strings | linux.com.html äöüÄÖÜ' | tr 'äöüÄÖÜ :|?' 'aouAOU____'
Und du könntest unter windows einfach die bash nehmen, ggf sogar zusammen mit cygwin um eine komplette Unix-Umgebung zu haben. Dann gehen solche Sachen viel einfacher zu machen.
lks
Nachtrag:
Für die Umlaute kannst Du sed benutzen, wenn Du nicht einfach nur die Doppelpunkte mit tr entfernen willst:
echo 'äöüÄÖÜ' | sed "s/ä/ae/g; s/ü/ue/g; s/ö/oe/g; s/Ä/Ae/g; s/Ü/Ue/g; s/Ö/Oe/g;"
Hallo,
ich habe vor einiger Zeit mal in diesem Thread ein Perl-Skript gepostet, es ersetzt Sonderzeichen in Dateinamen.
Ich würde in Deiner Situation eine Skriptsparche wie Perl (natürlich geht das mit Python, Ruby o.ä. auch) einsetzen, die auch unter Windows läuft. Die Shebangzeile #!/usr/bin/perl wird unter Windows ignoriert, wenn Du das Skript mit ".pl" Endung benennst, kannst Du es unverändert sowohl unter Windows wie auch Linux laufen lassen.
Wenn Du das Pipe-Zeichen '|' ins Skript einbaust, musst Du es wahrscheinlich mit Backslash escapenfürs Fragezeichen gilt das Gleiche.
Markus
ich habe vor einiger Zeit mal in diesem Thread ein Perl-Skript gepostet, es ersetzt Sonderzeichen in Dateinamen.
Ich würde in Deiner Situation eine Skriptsparche wie Perl (natürlich geht das mit Python, Ruby o.ä. auch) einsetzen, die auch unter Windows läuft. Die Shebangzeile #!/usr/bin/perl wird unter Windows ignoriert, wenn Du das Skript mit ".pl" Endung benennst, kannst Du es unverändert sowohl unter Windows wie auch Linux laufen lassen.
Wenn Du das Pipe-Zeichen '|' ins Skript einbaust, musst Du es wahrscheinlich mit Backslash escapen
s/\|/_/g
Markus
Hallo,
den senkrechten Strich ("Pipe") kannst du so ersetzen:
.. output:
Für den Rest schaust du hier: http://www.dostips.com/forum/viewtopic.php?f=3&t=1485
bb
den senkrechten Strich ("Pipe") kannst du so ersetzen:
@echo off &setlocal
set "string=|bla|bla|:bla"
set "string=%string:|=_%"
echo %string%
endlocal
_bla_bla_:bla
Für den Rest schaust du hier: http://www.dostips.com/forum/viewtopic.php?f=3&t=1485
bb
Grüß' dich.
Kann es sein, dass dein Skript unnötig kompliziert ist? Ich habe auf meinem Rechner (Microsoft Windows [Version 6.1.7601]) folgendes ausprobiert:
funktioniert einwandfrei. Allerdings nur dann, wenn man die Pipes ("|") als erstes ersetzt und danach den Rest.
Ich würde die verzögerte Erweiterung von Umgebungsvariablen noch vor der for-Schleife aktivieren.
Falls es bei dir auf die genaue Einhaltung der Schritte (Kopieren des Dateinamens in die Zwischenablage im Speichern-Dialog, Batch per Tastenkombi, Einfügen usw.) nicht ankommt — und wenn die Interaktion mit den Anwender sowieso nicht ausgeschlossen wird, sprich, wenn es eh kein unbeaufsichtigter Job ist —, schaue dir das Tool "Ant Renamer" an. Dort kannst du eine Ersetzungstabelle anlegen und diese immer wieder benutzen. Dann musst du nicht jede einzelne Datei umbenennen, sondern kannst warten, bis sich einige angesammlt haben. Ich benutze das Tool u.a. sogar zur Transliteration ganzer Alphabete.
Kann es sein, dass dein Skript unnötig kompliziert ist? Ich habe auf meinem Rechner (Microsoft Windows [Version 6.1.7601]) folgendes ausprobiert:
c:\>set test=blabla:blabla^|bla:bla^|bla
c:\>set test
test=blabla:blabla|bla:bla|bla
c:\>set test=%test:|=_%
c:\>set test
test=blabla:blabla_bla:bla_bla
c:\>set test=%test::=_%
c:\>set test
test=blabla_blabla_bla_bla_bla
funktioniert einwandfrei. Allerdings nur dann, wenn man die Pipes ("|") als erstes ersetzt und danach den Rest.
Ich würde die verzögerte Erweiterung von Umgebungsvariablen noch vor der for-Schleife aktivieren.
Falls es bei dir auf die genaue Einhaltung der Schritte (Kopieren des Dateinamens in die Zwischenablage im Speichern-Dialog, Batch per Tastenkombi, Einfügen usw.) nicht ankommt — und wenn die Interaktion mit den Anwender sowieso nicht ausgeschlossen wird, sprich, wenn es eh kein unbeaufsichtigter Job ist —, schaue dir das Tool "Ant Renamer" an. Dort kannst du eine Ersetzungstabelle anlegen und diese immer wieder benutzen. Dann musst du nicht jede einzelne Datei umbenennen, sondern kannst warten, bis sich einige angesammlt haben. Ich benutze das Tool u.a. sogar zur Transliteration ganzer Alphabete.
Was hältst du davon?
Gruß
format-c
@SETLOCAL
for /f "tokens=*" %%a in ('sfk fromclip') do set "zwischenablage=%%a"
@echo.
@echo.vorher
@set zwischenablage
@set zwischenablage=%zwischenablage:|=_%
@set zwischenablage=%zwischenablage::=_%
@set zwischenablage=%zwischenablage:?=_%
@set zwischenablage=%zwischenablage:ä=ae%
@set zwischenablage=%zwischenablage:ö=oe%
@set zwischenablage=%zwischenablage:ü=ue%
@echo.
@echo.nachher
@set zwischenablage
echo %zwischenablage% | sfk toclip
- weniger Code
- kein Zugriff auf die Festplatte notwendig
Gruß
format-c
Hallo freckeldfrickler.
ist nicht das gleiche wie In der ersten zeile "pumpst" du mit jeder Ausführung dieser Anweisung die
Ferner musst du kontrollieren, dass bei den
Hier ist ein Beipiel, wie sich die "" und das Leerzeichen auf die Zuweisung auswirken:
Grüße
format-c
set zwischenablage="%zwischenablage:ä=ae%"
set "zwischenablage=%zwischenablage:ä=ae%"
%zwischenablage%
mit den Anführungszeichen auf.Ferner musst du kontrollieren, dass bei den
set
-Anweisungen am Ende der Zeile keine Leerzeichen stehen (das ist z.B. dann der Fall, wenn du den Quellcode von dieser Internetseite kopierst).Hier ist ein Beipiel, wie sich die "" und das Leerzeichen auf die Zuweisung auswirken:
c:\>set test=abc
c:\>set test
test=abc
c:\>set test="abc"
c:\>set test
test="abc"
c:\>set "test=abc"
c:\>set test
test=abc
c:\>set test_mit_Leerzeichen_am_Ende="abc"
c:\>echo -%test_mit_Leerzeichen_am_Ende%-
-"abc" -
Grüße
format-c
Zitat von @freckeldfrickler:
Allerdings habe ich noch weitere Fragen, die bei der Problemlösung aufgetaucht sind.
Das berifft die Ersetzung mit SED (für Windows, CYGWIN).
Wie zum Teufel funktioniert die Ersetzung von Umlauten und anderen Sonderzeichen unter Windows?
ersetzt ohne Probleme , hier O durch U.
Aber wie ersetz man Ö durch Oe? oder gar das Leerzeichen durch den Unterstrich?
Allerdings habe ich noch weitere Fragen, die bei der Problemlösung aufgetaucht sind.
Das berifft die Ersetzung mit SED (für Windows, CYGWIN).
Wie zum Teufel funktioniert die Ersetzung von Umlauten und anderen Sonderzeichen unter Windows?
> c:\cygwin\bin\sed -e "s/O/U/g;s/A/E/g" c:\tmp\text > c:\tmp\text.new
>
ersetzt ohne Probleme , hier O durch U.
Aber wie ersetz man Ö durch Oe? oder gar das Leerzeichen durch den Unterstrich?
Wie ich schon oben schrieb:
echo 'äöüÄÖÜ ' | sed "s/ä/ae/g; s/ü/ue/g; s/ö/oe/g; s/Ä/Ae/g; s/Ü/Ue/g; s/Ö/Oe/g; s/ /_/g;"
Was wird denn angezeigt, wenn Du unter cygwin ausführst?
Markus
echo $LANG
Markus
Naja, so schwierig ist es nicht. Die Variable $LANG enthält die Informationen über die locales. Wenn Du den obigen Befehl ausführst, also im Terminal (cygwin) ohne Anführungsstriche, so wie es da stehtdann wird der Inhalt der Variablen angezeigt.
Wenn da nix angezeigt wird, dann ist die Variable nicht gesetzt. Mach malgenau so!!! also LANG ohne $ und keine Leerzeichen vor und hinter dem =. Danach nochmal echo $LANG. Dann müsste die gesetzt sein. Danach kannst Du es mit Lochkartenstanzers sed-Kommando nochmal versuchen. Und von der Codepage hab ich keine Ahnung, das musst Du ggf. nochmal ausprobieren.
Markus
echo $LANG
Wenn da nix angezeigt wird, dann ist die Variable nicht gesetzt. Mach mal
export LANG=de_DE.utf8
Markus
Zitat von @freckeldfrickler:
HH ! (Hallo hmarkus!)
Ich habe mal überlegt. Warum ist das wichtig, was am bash-prompt $LANG ausgibt?
Ich war bisher der Annahme, dass die unter cygwin/bin vorhandenenen .exe-Dateien
"Standalone-Tools" sind, die unter Windows laufen. Das ist doch richtig so ? Kann das mal jemand klar stellen ? Oder bin
ich da auf einem falschen Dampfer?
Grüsse
FF
Du hast ja oben geschriebenHH ! (Hallo hmarkus!)
Ich habe mal überlegt. Warum ist das wichtig, was am bash-prompt $LANG ausgibt?
Ich war bisher der Annahme, dass die unter cygwin/bin vorhandenenen .exe-Dateien
"Standalone-Tools" sind, die unter Windows laufen. Das ist doch richtig so ? Kann das mal jemand klar stellen ? Oder bin
ich da auf einem falschen Dampfer?
Grüsse
FF
"When using a program in a console window (command.com or cmd.exe) and setting LANG and LANGUAGE, you must also set the > correct {code page} with the {chcp} command; for Western European languages, code page {1252} usually suffices."]
Also scheint cygwin ja Wert auf die locales zu legen. Es geht ja hier um die korrekte Anzeige der Umlaute (die man besser nicht innerhalb von Dateinamen benutzt).Markus
Zitat von @freckeldfrickler:
"Standalone-Tools" sind, die unter Windows laufen. Das ist doch richtig so ? Kann das mal jemand klar stellen ? Oder bin
ich da auf einem falschen Dampfer?
"Standalone-Tools" sind, die unter Windows laufen. Das ist doch richtig so ? Kann das mal jemand klar stellen ? Oder bin
ich da auf einem falschen Dampfer?
kommt drauf an wie die compiliert udn gelilnkt sind. Normalerweise kann man alles, was man gegen dir cygwin.dll liegt auch standalone laufen lasssen. Allerdings komt es im wesentlichen auch drauf an, ob und welche Umgebungsvariablen gesetzt sind. Die können sich durchaus deutlich von denen in einer cygwin-bash-umgebung unetrscheiden.
Deswegen arbeite ich normalerweise grundsätzlich in einer cygwin Umgebung, um vor Überraschungen gefeit zu sein.
lks
Ach so, ich hatte nur gesehen, dass es um die LANG-Variable geht. Gibt es denn für sed.exe keine Gebrauchsanweisung?
Mir fällt übrigens auf, dass unter Linux der sed mit einfachen ' aufgerufen wird, nicht mit ", vielleicht ist da was falsch. Zunächst solltest Du versuchen, den Befehl mal ohne Umlaute auszuführen. Wenn das funktioniert, kannst Du es mit Umlauten versuchen.
Markus
Mir fällt übrigens auf, dass unter Linux der sed mit einfachen ' aufgerufen wird, nicht mit ", vielleicht ist da was falsch. Zunächst solltest Du versuchen, den Befehl mal ohne Umlaute auszuführen. Wenn das funktioniert, kannst Du es mit Umlauten versuchen.
Markus
Unter Linux ist das beinahe schon trivial..... die sed-Kommandos von Lochkartenstanzer kannst Du so übernehmen, ersetze aber " durch '.
Für die Zwischenablage gibt's unter Linux auch Tools, mit denen man das bearbeiten kann, da musst Du mal ins Repository von Debian schauen. Hier ist z.B. eine Liste und hier mehr Infos dazu https://wiki.archlinux.org/index.php/Clipboard
Markus
Für die Zwischenablage gibt's unter Linux auch Tools, mit denen man das bearbeiten kann, da musst Du mal ins Repository von Debian schauen. Hier ist z.B. eine Liste und hier mehr Infos dazu https://wiki.archlinux.org/index.php/Clipboard
Markus
In der Dokumentation für die Installation von sed.exe unter Windows http://gnuwin32.sourceforge.net/install.html finde ich
Vielleicht hilft das.
Markus
Native-language support
Most GNU packages have the ability to output messages in several languages. This native-language support (NLS) requires the LibIntl and the LibIconv libraries. On MS-Windows they have been adapted so that NLS chooses the system language, unless the environment variables LANG and LANGUAGE have been set. The language codes (ISO 639) for these environment variables are different from the MS-Windows ones. When using a program in a console window (command.com or cmd.exe) and setting LANG and LANGUAGE, you must also set the correct code page with the chcp command; for Western European languages, code page 1252 usually suffices. You can change the default code page by changing the OEMCP value in the registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
For other languages, such as those with a Cyrillic character set, NLS may not operate correctly, unless a TrueType font with these characters has been chosen. If you want to disable NLS, then set the environment variables LANGUAGE and LANG to en; then all messages will be in English.
Vielleicht hilft das.
Markus