Альтернативный способ с sed
.
Для N = 1 :
sed '$!N; /.*\n.*pattern/P; D' FILE
Для N = 2
sed '1N; $!N; /.*\n.*\n.*pattern/P; D' FILE
Для случая N = 2 в первой строке будет указано следующее ] N-1 строк в пространстве шаблонов, затем запускает цикл N; P; D
- считывает еще одну строку и, если последняя строка в пространстве шаблонов совпадает, печатает первую строку в шаблоне пробел, затем удалите его, начав новый цикл.
Обратной стороной является то, что его необходимо изменить для разных значений N :
Для N = 3 :
sed '1{N;N}; $!N; /.*\n.*\n.*\n.*pattern/P; D' FILE
Для N = 4 ]:
sed '1{N;N;N}; $!N; /.*\n.*\n.*\n.*\n.*pattern/P; D' FILE
, поэтому он быстро становится громоздким, хотя для больших значений N вы можете подготовить файл сценария и передать его в sed
.
Это бессмысленно.
Так обрабатывается ksh93
, если для унарного оператора слишком много аргументов и унарный оператор начинается с -
, тогда второй будет выбран в качестве аргумента и остальные будут проигнорированы:
$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ ksh -c '[ -e a.out foo a ] && echo yes'
yes
(За исключением случаев, когда второй аргумент -a / -o
, он не будет проигнорирован)
Проверка источника ksh93 test
подтверждают такое поведение.
Также выполняется strace
:
$ { strace -p "$$" & sleep 1; [ -f a.out -size +0 ]; kill "$!"; }
[1] 18467
Process 18455 attached
restart_syscall(<... resuming interrupted call ...>) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("a.out", {st_mode=S_IFREG|0755, st_size=8320, ...}) = 0
kill(18467, SIGTERMProcess 18455 detached
<detached ...>
Другие оболочки, подобные Борну, сообщают об ошибке в этом случае. Поведение не определено POSIX.
Если вы хотите проверить, существует ли файл и имеет ли его размер больше 0, то стандартные оболочки имеют тестовый оператор -s
:
[ -s file ] && echo 'file exist and size greater than 0'
ksh88
также ведут себя так же. С моей виртуальной машиной Solaris 10:
$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ strings /usr/bin/ksh | grep -i version
@(#)Version M-11/16/88i
оболочки Pre-POSIX также ведут себя так же, включая оболочку Bourne в Solaris 10, семейную оболочку Bourne, Schily osh и Schily sh.
Скорее всего, это ошибка. Форма -размер +0
допустима для стандартной утилиты find
(и означает непустой файл), но не для теста
(также известного как [
). Похоже, автор сценария повторно использовал его, не сохранив надлежащего контекста. Если это ksh
, он должен иметь следующую проверку:
–s file
True, if file exists and has size greater than zero.
В качестве альтернативы, этот сценарий предназначен для (мне неизвестно) расширенной оболочки, для которой тест
является внутренним и расширен для таких сложные конструкции. (Является ли ваш ksh определенной расширенной версией?)