Предполагая, что вы имеете в виду «между« месяцами назад »и« http: // », этот perl
скрипт делает то, что вы хотите:
#! /usr/bin/perl
use strict;
my $join=0;
while(<>) {
if (m/ ago$/) { $join=1 };
if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; };
if ($join == 1) {
s/\s/_/g;
s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/g;
};
print;
}
ПРИМЕЧАНИЕ: Я намеренно использовал [[: blank ::]]
, а не \ s
в первой операции s ///
выше, так что изменяются только пробелы и табуляторы в этой строке, а не новые строки. Я хочу, чтобы второй подстановкой заменил все виды пробелов, включая символы новой строки (за исключением пробела, непосредственно предшествующего месяцев назад
, и пробела между месяцами
и назад
]).
Вывод:
lots of text...
page_5.html months ago___This_is_the_password:_6743412_<http://website.com_etc...
more text...
Это также можно было бы записать в однострочном формате, используя perl -p
:
perl -p -e 'if (m/ ago/) { $join=1 }; if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; }; if ($join == 1) {s/\s/_/g}; s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/' speld.txt
Спасибо terdon за подсказку; с помощью strace -e stat bash -c "newuser" 2>&1 | grep /root/bin
я обнаружил, что невидимый возврат каретки каким-то образом вклинился перед закрывающей кавычкой в сценарии профиля, создавая фактический путь /root/bin\r
. Я стер и снова -набрал путь, и теперь он работает.