Внимательно прочитав man-страницу mount и поэкспериментировав в оболочке с различными вариантами монтирования, нашел решение.
Похоже, правильная запись в fstab такая
/dev/mmcblk0p1 /media/sd vfat user,noauto,rw,umask=0000 0 0
Похоже на то:
auto
недостаточно, лучше указать тип ФС umask
выберите доступные разрешения (в данном случае для всех пользователей)Ты рядом:
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
будет доступен, вы также можете использовать его, чтобы убедиться, что он работает.
Я бы сделал так: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