Вы могли также использовать -path
параметр find
вместо -name
:
find . -path "dir2/*.c"
Это могло позволить Вам находить файлы в dir2
даже если dir2
не был прямой подкаталог, НАПРИМЕР:
# find . -path "*/dir2/*.c"
./dir_a/dir2/file.c
./dir_b/dir2/file.c
Для понимания, что продолжается в этом уровне детализации я думаю, что необходимо достигнуть исходного кода. Так, цитирование vim-7.1.314/src/ex_cmds.c
(комментарий во главе определения ex_global()
):
Это реализовано в двух передачах: сначала мы сканируем файл для шаблона и устанавливаем метку каждой строки это (не) соответствия. во-вторых, мы выполняем команду для каждой строки, которая имеет метку. Это требуется, потому что после удаления строк мы не знаем, где искать следующее соответствие.
Таким образом, если Вы удаляете строку в :g
'команда редактора, метка этой строки уходит также. Если Вы создаете строку в :g
'команда редактора, это не будет отмечено, таким образом, команда не выполнится на нем. В Вашем примере к строке 3 присоединяются со строкой 2, таким образом, метка на строке 3 исчезает, и следующая метка после того, как строка 2 является той, первоначально ставит строку 4.
Кроме того, ex_global
наборы global_busy
переменная, которая вызывает несколько команд, включая :s
, вести себя немного по-другому. Я не думаю, что различие релевантно здесь все же.
Gilles ответил Ваш “почему?”, но я думал, что Вам могло бы быть интересно более простым способом сделать то, что Вы хотели.
Я хочу новые строки после каждого
bar
.
Вместо того, чтобы заменить оконечный знак строки (таким образом присоединяющийся к строкам и теряющий внутреннюю метку, на ответ Gilles), добавляет пустая строка прямо до конца каждого согласующего отрезка длинной линии. Использовать $
разобраться в соответствии нулевой ширины до конца строки и вставить разрыв строки там (также никакая потребность в /g
модификатор начиная с шаблона будет только соответствовать однажды на строку).
:g/bar/s/$/\r/