Ich konnte Ihrer Frage nicht sagen, wo in den Dateinamen die Zeilenumbrüche stehen könnten, also gehe ich davon aus, dass sie irgendwo sein könnten. Dies macht das Matching schwieriger.
Die einfachste Lösung besteht darin, alle Zeilenumbrüche aus der Eingabe zu entfernen, bevor unerwünschte Dateinamen entfernt werden.
Ich habe dieses Skript gemacht:
#!/usr/bin/perl $filename = "filelist.txt"; open(FILE, $filename) or die "Cant open $filename\n"; # Undefine the record separator, so that the entire file will be read into a single string # instead of an array with records separated by newlines local $/ = undef; $lines = <FILE>; close(FILE); print "Before\n------\n"; print $lines; # Remove all newlines $lines =~ s/\n+//g; # Remove all "textClipping" files $lines =~ s/\/Volumes\/[^ ]*.textClipping//g; # Turn multiple consecutive spaces into single spaces $lines =~ s/ +/ /g; print "After\n-----\n"; print "$lines\n";
und fütterte es als filelist.txt:
/Volumes/folder/folder/file.doc /Volumes/folder/folder/file.textClipping /Volumes/folder/folder/file.doc /Volumes/folder/folder/file.textClipping /Volumes/folder/folder/fi le.textClipping /Volumes/folder/folder/file.doc
was gab diese Ausgabe:
Before ------ /Volumes/folder/folder/file.doc /Volumes/folder/folder/file.textClipping /Volumes/folder/folder/file.doc /Volumes/folder/folder/file.textClipping /Volumes/folder/folder/fi le.textClipping /Volumes/folder/folder/file.doc After ----- /Volumes/folder/folder/file.doc /Volumes/folder/folder/file.doc /Volumes/folder/folder/file.doc
Zum Schluss denke ich, dass Sie mit dem Muster, das Sie in Ihrer Frage vorschlagen, sehr vorsichtig sein sollten:
/Volumes/.*.textClipping
schon seit . erfasst jedes Zeichen außer einem Zeilenumbruch, jedoch auch ein Leerzeichen. Ich habe dieses Muster mit dieser Eingabe ausgeführt, wie von Ihrer Frage vorgeschlagen:
/Volumes/folder/folder/file.doc /Volumes/folder/folder/file.textClipping /Volumes/folder/folder/file.doc /Volumes/folder/folder/file.textClipping /Volumes/folder/folder/fi le.textClipping /Volumes/folder/folder/file.doc
und bekam diese Ausgabe, von der ich glaube, dass sie nicht das ist, was Sie wollen:
/Volumes/folder/folder/fi le.textClipping /Volumes/folder/folder/file.doc
Bearbeiten : Sie haben kürzlich eine Antwort auf Ihre eigene Frage gepostet, in der Sie erneut in diese Falle geraten, aber ich habe nicht genug Ansehen, um einen Kommentar dazu zu posten. Anstelle von /Volumes/.*\n*.textClipping/g
(die mit Leerzeichen übereinstimmt und daher möglicherweise mehr als ein Dateiname gleichzeitig entfernt wird), empfehle ich dringend, Folgendes zu berücksichtigen /Volumes/[^ ]*\n*.textClipping/g
: das [^ ]*
wird alles außer Leerzeichen entsprechen.