У вас там что-то вроде мешанины, не все из которых соответствуют тому, что вы сказали. Давайте разберем, что у вас есть, и тогда, возможно, вы сможете работать оттуда к тому, что вы хотите.
$txt=~s/\r//s; # removes a single \r from the line. Did you mean to use g on this one?
$txt=~s/[\t ]\n//s; # match a single \t OR space right before a \n, and remove.
$txt=~s/ +/ /gs;# match at least 2 spaces, replace with a single space
$txt=~s/\t+/ /gs;# match at least 2 \t, replace with a single space
$txt=~s/\n /\n/s;# remove a space immediately following a \n
$txt=~s/\t /\t/s;# remove a space immediately following a \t
$txt=~s/\n+/ /gs;# match at least 2 \n, replace them all with a single space
У меня такое ощущение, что это совсем не то, чего вы хотите достичь.
Мне, честно говоря, неясно, что вы хотите сделать. При прочтении вашего заявленного намерения я бы подумал, что вы захотите заменить все двойные табуляции на отдельные табуляции, все двойные разрывы строк на одиночные разрывы строк, а все двойные пробелы на одинарные пробелы. Кроме того, я предполагаю, что вы на самом деле хотите сыграть этих персонажей, а не просто удваивать. Вот регулярные выражения для того, что я только что сказал, надеюсь, это даст вам кое-что для продолжения:
(Я также удалил все \ r).
$txt=~s/\r//gs;# remove all \r
$txt=~s/\t+/\t/gs;# replace all runs of > 1 tab with a single tab
$txt=~s/\n+/\n/gs;# replace all runs of > 1 \n with a single \n
$txt=~s/ +/ /gs;# replace all runs of > 1 space with a single space
Учитывая, что ваши попытки регулярных выражений, похоже, не соответствуют тому, как я прочитал ваше заявленное желание, я подозреваю, что в том, что вы действительно хотите здесь делать, есть некоторая неясность. Возможно, вам захочется подумать о том, чего вы пытаетесь достичь, что должно помочь регулярным выражениям стать более понятными.