У меня была такая же проблема на OSX El Capitan, и я решил ее, обновив rsync до версии 3.11. Проблема возникла у меня на версии 2.6.9.
Разве простое изменение местами двух grep
не сделает то, что вы хотите, удалив строки precision
заранее, чтобы они не совпадали со строками created_at
во втором grep
?
grep -v precision schema.rb | grep -A1 -B3 created_at
create_table "things", id: :serial, force: :cascade do |t|
t.string "other_column"
#...
t.datetime "created_at"
end
Я не думаю, что то, что я пытался сделать, возможно, если я свяжу вместе 2 grep
команды (, поскольку строки контекста относятся к каждой отдельной grep
команде ).
Мне пришло в голову, что мне нужен негативный просмотр вперед. Тогда все это можно было бы сделать с помощью одной команды grep
.
К моему удивлению, похоже, что GNU grep
действительно поддерживает regex lookbehind/lookahead, но только если вы используете опцию --perl-regex
.
Вот команда grep
, которая дает мне то, что я искал:
⟫ grep --perl-regexp 'created_at(?!(.*precision:))' schema.rb -B3
create_table "things", id: :serial, force: :cascade do |t|
t.string "other_column"
#...
t.datetime "created_at"
awk-решение
$ awk '/create_table/,/created_at/&&!/precision:/' schema.rb
create_table "things", id: :serial, force: :cascade do |t|
t.string "other_column"
#...
t.datetime "created_at"
create_table "users", id: :serial, force: :cascade do |t|
t.citext "email"
#...
t.datetime "created_at", precision: 0
end
$
Ни один из приведенных ниже способов не дает точно того, что вам нужно, но я добавлю их, на случай, если они будут каким-то образом полезны.
решение sed, которое печатает строку таблицы create _и соответствие
Найдите строку таблицы create _, если она найдена, сохраните ее в буфере хранения 'h'. Ищите созданный _с указанием точности, если он найден, игнорируйте его. Ищите созданный _в одиночку, если найдете, распечатайте.
$ sed -n '/create_table/h;/created_at.*precision:/d;/created_at/{H;g;p}' schema.rb
create_table "things", id: :serial, force: :cascade do |t|
t.datetime "created_at"
$
awk-решение, которое печатает строку таблицы create _и соответствие
Если вы специально хотите создать строку таблицы _для совпадения, вы можете использовать
$ awk '/create_table/{t=$0}/created_at/&&!/precision:/{print t"\n"$0}' schema.rb
create_table "things", id: :serial, force: :cascade do |t|
t.datetime "created_at"
$
awk-решение, печатающее таблицу
Немного дальше: если вам нужны только имена таблиц, внутри которых есть совпадающая строка, вы можете использовать
$ awk '/create_table/{t=$2}/created_at/&&!/precision:/{print substr(t,2,length(t)-3)}' schema.rb
things
$