Perl несколько строк данных между двумя шаблонами в одну строку вывода

Вы можете отфильтровать все строки с помощью grep, используя регулярное выражение.

grep '[a-z-]1\?\.domain_name' file > newfile

Это возвращает все строки с буквами или минусом и необязательным 1перед «.domain _name».


Обратной операцией будет удаление всех строк, содержащих числа > 1, перед «.domain _name»:

grep -v '\([2-9]\|[0-9]1\)\.domain_name' file > newfile

Соответствует строкам с цифрами от 2 до 9 в качестве последней цифры перед ".domain _name" или числам, состоящим как минимум из двух цифр, где последняя цифра1(соответствует 11 или 21 и т. д. ). Опция -vиспользуется для выбора строк, не соответствующих -.

1
01.07.2020, 11:20
5 ответов

относительно вашего perl -решения :из-за конструкции -p предоставленный сценарий обрабатывает ввод построчно. Это затрудняет соединение строк, поскольку линия не знает, что следует за ней.

Когда вы обрабатываете ввод как одну строку, вы можете делать умные замены для соединения строк. Вот пример, похожий на ваш способ вызова perl:

perl -e 'local $/;my $data = <>; $data =~ s/\nTiming/ Timing/g ; print $data' file1

Этот скрипт считывает весь ввод в одну строку ($data )и заменяет новую строку перед Timing пробелом. Это происходит для всех вхождений (g переключатель для глобального после замены)

0
18.03.2021, 23:23

Решение GNU sed:

sed -rz 's/\n(Timings)/ \1/g' file1
1
18.03.2021, 23:23

Использование :

perl -ne '
    my $s = $_ if
        /pure info:\s+myjob-relaed_rawmaterila/
       ..
       /pure info:\s+adhoc-onetime-myjob-hotcase/;
    do{
        chomp;
        s/\s{3,}/ /;
        $_ = sprintf "%s ", $s;
        s/pure info/\n$&/g;
        print
    } for $s;
    END{ print "\n" }
' file1
0
18.03.2021, 23:23

Опаздываю на шоу, но если расстояние не проблема, то....

awk -v RS="pure info: " 'NR>1{$1=$1; print RS$0}' file

Просто используйте pure info: в качестве разделителя записей RS, перекомпонуйте $1=$1и printв началеRS

pure info: myjob-relaed_rawmaterila Timings: Full
pure info: Check-platform-Log-90Days Timings: Full Timings: Incremental
pure info: Check-vitorydows-Log-90Days Timings: Full Timings: Incremental
pure info: Note_michael Timings: Full
pure info: adhoc-activity-myjob-platform Timings: Full
pure info: adhoc-activity-myjob-vitory Timings: Full
pure info: adhoc-myjob-platform-03 Timings: Full Timings: Full-1month
pure info: adhoc-onetime-myjob-hotcase Timings: Full
pure info: adhoc-onetime-myjob-platform

И если вы отчаянно нуждаетесь в расстоянии, тогда gsubодин назад в...

awk -v RS="pure info: " 'NR>1{$1=$1; gsub("Timings:","Timings: ",$0);print RS$0}' file

pure info: myjob-relaed_rawmaterila Timings:  Full
pure info: Check-platform-Log-90Days Timings:  Full Timings:  Incremental
pure info: Check-vitorydows-Log-90Days Timings:  Full Timings:  Incremental
pure info: Note_michael Timings:  Full
pure info: adhoc-activity-myjob-platform Timings:  Full
pure info: adhoc-activity-myjob-vitory Timings:  Full
pure info: adhoc-myjob-platform-03 Timings:  Full Timings:  Full-1month
pure info: adhoc-onetime-myjob-hotcase Timings:  Full
pure info: adhoc-onetime-myjob-platform
0
18.03.2021, 23:23

Perl one -лайнер:

perl -0777 -pe 's/\n(?=Timings:)/ /g' file

Опция -0777 заставляет Perl запихивать весь файл в $_. Затем все новые строки, которые появляются перед «Times :», заменяются.

Если есть другие заголовки помимо «Время», вы можете использовать отрицательный вид -вперед:

s/\n(?!pure info:)/ /g
0
18.03.2021, 23:23

Теги

Похожие вопросы