Ядро perldoc
идет с пакетом жемчуга в дуге. например. perldoc perllol
. Для большинства модулей вся утилита делает создать документацию из POD в источнике все же. /usr/lib/perl5/core_perl/POSIX.pm
оказывается, не имеет никакого POD, так не создает документации. Я предполагаю, потому что это - модуль XS так большая часть из, его - функция, находится в C где-то в другом месте.
При сравнении Дуги с полем Debian с perldoc на Debian некоторые базовые модули также имеют отдельное .pod
файл в /usr/share/perl/5.x/
тогда как у Arch нет ни одного.
POSIX.pm, кажется, немного отличается снова в этом .pod
находится в каталоге lib..
debian$ find /usr/lib/ -name "*.pod"
/usr/lib/perl/5.10.1/Config.pod
/usr/lib/perl/5.10.1/POSIX.pod
Который делает, это быть похожим на debian делает что-то пользовательское здесь.
На самом деле, если Вы проверяете источник жемчуга POSIX.pod
отдельный файл, сидящий рядом с модулем жемчуга.
Возможно, зарегистрируйте ошибку с дугой, чтобы включать его? Я предполагаю, что Вы могли привести доводы в пользу него, чтобы быть измененными в Perl вместо этого, если это идет вразрез с некоторым стандартом. Существуют люди Perl на stackoverflow, который, вероятно, знал бы.
С помощью awk
можно сделать:
awk '{print >out}; /XYZ/{out="file2"}' out=file1 largefile
Объяснение: Первый аргумент awk
(out=file1
) определяет переменную с именем файла, которая будет использована для вывода, в то время как последующий аргумент (largefile
) обрабатывается. Программа awk
выведет все строки в файл, заданный переменной out
({распечатка >out}
). Если шаблон XYZ
будет найден, то выходная переменная будет переопределена, чтобы указать на новый файл ({out="file2}"
), который будет использоваться в качестве целевой для печати последующих строк данных.
References:
Простым взломом является печать на STDOUT или STDERR, в зависимости от того, был ли согласован целевой шаблон. Затем можно использовать операторы перенаправления оболочки для соответствующего перенаправления вывода. Например, в Perl, предполагая, что входной файл называется f
и два выходных файла f1
и f2
:
Отбрасывание линии, совпадающей с шаблоном разделения:
perl -ne 'if(/XYZ/){$a=1; next} ; $a==1 ? print STDERR : print STDOUT;' f >f1 2>f2
Включая совпадающую строку:
perl -ne '$a=1 if /XYZ/; $a==1 ? распечатать STDERR : распечатать STDOUT;' f >f1 2>f2
В качестве альтернативы, распечатайте в разных файлах:
Отбрасывание линии, соответствующей шаблону разделения:
perl -ne 'BEGIN{open($fh1,">", "f1");open($fh2,">", "f2");}.
if(/XYZ/){$a=1; next}$a==1 ? распечатайте $fh1 "$_" : распечатайте $fh2 "$_";' f
Включая совпадающую строку:
perl -ne 'BEGIN{open($fh1,">", "f1"); open($fh2,">", "f2");}
$a=1 если /XYZ/; $a==1 ? распечатать $fh1 "$_" : распечатать $fh2 "$_";' f
В современном ksh
варианте оболочки (т.е. без sed
) одного из ответов, основанных на sed
выше:
{ read in <##XYZ ; print "$in" ; cat >file2 ;} <largefile >file1
и другого варианта только в ksh
(т.е. без sed
). также исключая cat
):
{ read in <##XYZ ; print "$in" ; { read <##"" ;} >file2 ;} <largefile >file1
(Чистое решение ksh
кажется вполне работоспособным; в тестовом файле на 2,4 ГБ ему потребовалось 19-21 секунда, по сравнению с 39-47 секундами с подходом, основанным на sed
/cat
).
{ sed '/XYZ/q' >file1; cat >file2; } <infile
В GNU sed
вы должны использовать переключатель -u
nbuffered. Однако большинство других sed
должны просто работать.
Чтобы исключить XYZ ...
{ sed -n '/XYZ/q;p'; cat >file2; } <infile >file1
Попробуйте это с помощью GNU sed:
sed -n -e '1,/XYZ/w file1' -e '/XYZ/,${/XYZ/d;w file2' -e '}' large_file
Это задание для csplit
:
csplit -sf file -n 1 large_file /XYZ/
будет s
незаметно разделить файл, создав части с предварительным f
ix файлом
] и n
, записанные с использованием одной цифры, например file0
и т. Д. Обратите внимание, что использование / regex /
приведет к разделению, но не включает строку, которая соответствует regex
. Чтобы разделить на и , включая соответствие строки регулярное выражение
, добавьте смещение +1
:
csplit -sf file -n 1 large_file /XYZ/+1
Это создает два файла, file0
и файл1
. Если вам абсолютно необходимо, чтобы они назывались файл1
и файл2
, вы всегда можете добавить пустой шаблон в команду csplit
и удалить первый файл:
csplit -sf file -n 1 large_file // /XYZ/+1
создает file0
, file1
и file2
, но file0
пуст, поэтому его можно безопасно удалить:
rm -f file0