Подстановка строки Perl в bash с использованием разделителя полей - Пропустить строку заголовка - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над анонимизацией нескольких полей в текстовом файле, разделенном точкой с запятой.

Сейчас у меня есть следующая команда:

perl -aF'(;)' -ne "s/^.{$length}/$x_string/ for @F[2*$index]; print @F" file

Где $index соответствуетиндекс строки, которую я хочу заменить относительно точки с запятой, $length - это размер строки для замены, а $x_string - простая строка из X.

Для $index, равного 1, $size равно 3 и $x_string равно XXX, если file имеет следующее содержимое:

azerty;012;test;20181201;;wxc;
ytreza;345;demo;20160214;;nbv;

Тогда команда perl возвращает это:

azerty;XXX;test;20181201;;wxc;
ytreza;XXX;demo;20160214;;nbv;

Моя проблема в том, что я хочу пропустить, а не анонимизировать потенциальную строку заголовка.Я знаю, как это сделать без оператора for - например, с помощью unless $. == 1 - но я не знаю, как управлять им в сочетании с параметром -F.

Обратите внимание, что я всегда будуу меня есть массив размера 1 из-за структуры моего файла конфигурации, объединяющей переменные index и length.

Я новичок с perl, поэтому я прошу вас помочь с этой проблемой!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Просто поместите само изменение (regex) на $. и в противном случае сделайте то же самое (печать)

perl -aF'(;)' -ne'$F[2*$index] =~ s/^.{$length}/$x_string/ unless $.==1; print @F' file

Нет необходимости в цикле for, так как вы указываете точно один @Fэлемент для изменения.(Кроме того, при -w вы увидите предупреждение о записи скаляра в виде массива / списка, используя @ sigil.)


Еще один способ - изменить $_ напрямуюрегулярное выражение и использовать -p.Поскольку -p всегда печатает $_, даже если строки не обрабатываются, теперь вы можете просто пропустить первую строку

perl -pe'next if $.==1; s/(?:.*?;){$index}\K.{$length}/$x_string/' file

Регулярное выражение соответствует $index последовательностям, заканчивающимся ;, сгруппированным беззахват из-за ?:, а затем \K утверждение отбрасывает все это, поэтому замена происходит только для того, что соответствует следующему.Таким образом, это регулярное выражение изменяет $length символов после $index -ой точки с запятой.

0 голосов
/ 06 декабря 2018

-n оборачивает

LINE: while (<>) {
    ... # your program goes here
}

вокруг вашего скрипта, так что вы можете добавить next LINE if $. == 1; к одному вкладышу, чтобы пропустить заголовок.

perl -aF'(;)' -ne "if (1 .. 1) { print; next LINE } s/^.{$length}/$x_string/ for @F[2*$index]; print @F" file

При этом используется оператор триггера.. для подсчета первой строки и блока в операторе if, затем печатает его.

...