Как разделить файл каждый раз, когда встречается регулярное выражение?

Внимательно прочитав man-страницу mount и поэкспериментировав в оболочке с различными вариантами монтирования, нашел решение.

Похоже, правильная запись в fstab такая

/dev/mmcblk0p1 /media/sd  vfat user,noauto,rw,umask=0000 0 0

Похоже на то:

  • autoнедостаточно, лучше указать тип ФС
  • umaskвыберите доступные разрешения (в данном случае для всех пользователей)
1
22.07.2020, 19:09
2 ответа

Ты рядом:

awk '/[0-9]-[0-9]{2}\/[[:upper:]]+-[0-9]{6}/ {
       if (file) close (file)
       file = sprintf("split%05i.txt", ++i)
     }
     file {print > file}' input.txt

Вы хотите, чтобы кодовый блок { if... }выполнялся для строк, соответствующих шаблону [0-9]..., поэтому он должен находиться в той же строке, что и /.../.

Второй кодовый блок {print > file}должен запускаться для каждой записи, пока установлено file, используя fileв качестве условия.

Наличие \nв вашем шаблоне здесь не имеет смысла, так как каждая запись, которая обрабатывается awk, в свою очередь, является содержимым каждой строки (, поскольку разделителем записей по умолчанию(RS)является \n), поэтому запись никогда не будет содержать символ новой строки. Вы также не хотите привязывать свое регулярное выражение здесь(^и$).

Я заменил ваш .+на [[:upper:]]+, чтобы быть более конкретным. Например, с .+это будет соответствовать blah 5-10/2 blah blah €1000000. Возможно, вам придется адаптироваться в зависимости от того, что вы хотите принять вместо PNLP.

Обратите внимание, что он также совпадает с blah 1234-56/XX-1234567890 blah, так как он содержит строку, соответствующую шаблону (, см. часть, выделенную жирным шрифтом ).

Я удалил gв gawk, так как этот код не относится к gawk. Однако обратите внимание, что все еще есть несколько реализаций awk, которые не поддерживают операторы {2}/ {6}выше (, хотя это требование POSIX ), поэтому, если вы знаете, что gawkбудет доступен, вы также можете использовать его, чтобы убедиться, что он работает.

1
18.03.2021, 23:18

Я бы сделал так:
perl -ne 'my $fh="/dev/stdout"; if(/7-04\/PNLP-(\d+)/) { close $fh; open($fh,">/path/to/outputfiles/file$1"); } ; print $fh $_;' < /path/to/inputfile

0
18.03.2021, 23:18

Теги

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