Perl Удаление новой строки

Кажется, я не могу удалить новую строку из вывода, который я получаю, выполняя команду на сервере Linux, и пробовал несколько разных способов.

вот мой код 1-я попытка

$location = `curl -m 5 -sI 216.58.219.206 | grep "Location:"`;
chomp ($location);
print "before\n";
print "$location";
print "after\n";

вывод, не работает, печатается с новой строки.

before
Location: http://www.google.com/
after

Вторая попытка

$location = `curl -m 5 -sI 216.58.219.206 | grep "Location:"`;
$location =~ s/\n//g;
print "before\n";
print "$location";
print "after\n";

Выход, все еще не работает.

before
Location: http://www.google.com/
after

Необработанный вывод оболочки

[user@localhost dir]# curl -m 5 -sI 216.58.219.206 | grep "Location:"
Location: http://www.google.com/
[user@localhost dir]#

Тоже не работает, я все еще вижу новую строку. Я что-то упускаю?


person Le Ray    schedule 14.07.2015    source источник
comment
Пожалуйста, отредактируйте свой вопрос, включив в него вывод вашего скрипта Perl, вывод curl -m 5 -sI 216.58.219.206 | grep "Location:" при запуске вручную в оболочке и ваш ожидаемый результат. Кроме того, убедитесь, что код, который вы включили, работает и воспроизводит вашу проблему... как указал Авинаш Радж в уже удаленном комментарии, ваш второй фрагмент использует $cmd, но в остальной части кода нет переменной $cmd.   -  person ThisSuitIsBlackNot    schedule 14.07.2015
comment
Вы изменили $\ или передали -l на perl (в командной строке или строке shebang)?   -  person ikegami    schedule 14.07.2015
comment
Просмотр ввода помогает - возможно, в вашем вводе есть более одной новой строки, и вы просто жуете одну из них. Недостаточно информации, чтобы мы могли вам помочь. Я также настоятельно рекомендую не использовать для этого регулярное выражение — в этом весь смысл chomp(). Если это не работает так, как вы думаете, то это проблема с вводом.   -  person Tim S.    schedule 14.07.2015
comment
Я вставил вывод для обоих фрагментов кода   -  person Le Ray    schedule 14.07.2015
comment
Я также добавил необработанный вывод оболочки.   -  person Le Ray    schedule 14.07.2015


Ответы (2)


Ответ curl возвращается с \r\n вместо просто \n.

Используйте od (восьмеричный дамп), чтобы убедиться в этом самостоятельно (-c означает отображение символов):

curl -m 5 -sI 216.58.219.206 | grep Location: | od -c
0000000   L   o   c   a   t   i   o   n   :       h   t   t   p   :   /
0000020   /   w   w   w   .   g   o   o   g   l   e   .   c   o   m   /
0000040  \r  \n
0000042

Вам нужно будет удалить обоих символов.

$location =~ s|\s*$||;  # Remove all trailing whitespace
person xxfelixxx    schedule 14.07.2015
comment
Привет. Да, я только что обнаружил это несколько минут назад. Спасибо большое! Кроме того, даже если в конце есть пробелы, почему регулярное выражение не удаляет \n - person Le Ray; 14.07.2015
comment
Ваше регулярное выражение удаляет \n, но не \r. \s соответствует всем пробельным символам. - person xxfelixxx; 14.07.2015

Вы можете удалить табуляцию, пробелы, новую строку и возврат каретки, используя tr

curl -m 5 -sI 216.58.219.206 | grep Location: | tr -d '\011\012\040' 
person sandeep    schedule 16.07.2015