По вашему вопросу я не могу сказать, где в именах файлов могут быть символы новой строки, поэтому я предполагаю, что они могут быть где угодно. Это делает сопоставление более сложным.
Самое простое решение может состоять в том, чтобы удалить все символы новой строки из ввода перед удалением нежелательных имен файлов.
Я сделал этот скрипт:
#!/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";
и скормил свой пример как 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
который дал этот вывод:
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
Наконец, я думаю, что вы должны быть очень осторожны, используя шаблон, который вы предлагаете в своем вопросе:
/Volumes/.*.textClipping
поскольку . захватит любой символ, кроме новой строки, но включая пробел. Я запустил этот шаблон на этом входе, как подсказывает ваш вопрос:
/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
и получил этот вывод, который я не думаю, что вы хотите:
/Volumes/folder/folder/fi le.textClipping /Volumes/folder/folder/file.doc
Изменить : вы недавно опубликовали ответ на свой вопрос, где вы снова попали в эту ловушку, но у меня недостаточно репутации, чтобы оставить комментарий к ней. Вместо /Volumes/.*\n*.textClipping/g
(который будет совпадать с пробелами и, следовательно, потенциально избавляться от более чем одного имени файла за раз), я настоятельно рекомендую вам рассмотреть /Volumes/[^ ]*\n*.textClipping/g
; [^ ]*
будет соответствовать все, кроме пробелов.