По вашему вопросу я не могу сказать, где в именах файлов могут быть символы новой строки, поэтому я предполагаю, что они могут быть где угодно. Это делает сопоставление более сложным.
Самое простое решение может состоять в том, чтобы удалить все символы новой строки из ввода перед удалением нежелательных имен файлов.
Я сделал этот скрипт:
#!/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
; [^ ]*
будет соответствовать всему, кроме пробелов.