\K
игнорирует часть совпадения , поэтому оно не отображается в $&
(или в части строки, которую заменит s///
. Но вы выводите $_
, переменная по умолчанию, которую print
использует, когда вы не даете ей аргумента.
Я не знаю, почему вы хотите вернуть последнее двоеточие. Если вы знаете, что вы собираетесь выводить только двоеточие, вы не нужны причудливые функции регулярных выражений. Сопоставьте строку, затем выведите известную строку:
print ':' if /.+\@.+:/
Но я подозреваю, что вы на самом деле пытаетесь сделать что-то еще. Вы пытаетесь пропустить баннер входа и захватить все, что после первого приглашения командной строки?
Кроме того, ваш однострочный запрос выглядит подозрительно. У вас есть:
cat test.txt | perl -ne 'print if /.+@.+\K:/' cat@sampleserver2:
Этот cat@sampleserver2:
является аргументом командной строки и неявный while(<>){...}
из переключателя -n
попытается открыть файл с таким именем и прочитать его. Возможно, у вас есть файл с таким именем. Это имя файла не является целью для оператора сопоставления, но я подозреваю, что вы думаете, что это .
Но, если у вас есть файл с это имя, почему вы также передаете другой файл? Здесь вам не нужно cat
. Это прочитает строки test.txt :
% perl -ne 'print if /.+@.+\K:/' test.txt