Если вы должны использовать sed
, команда будет:
sed -E -- '\-^([^/]*/[^/]*){3}$-d'
Но если вам не требуется использовать sed
, самое простое решение использует grep
.
Замените N в этой команде на желаемое значение N:
egrep -vx '([^/]*/[^/]*){N}'
grep
имеет параметр командной строки -v
, который заставляет grep
отображать все строки, которые не соответствуют регулярному выражению. Таким образом, задача состоит в том, чтобы создать регулярное выражение, которое соответствует строкам, содержащим ровно N вхождений символа косой черты, а затем использовать grep -v
с этим регулярным выражением.
Один пример — шаблон:
[^/]*/[^/]*
N экземпляров — шаблон:
([^/]*/[^/]*){N}
Ровно N экземпляров является шаблоном:
^([^/]*/[^/]*){N}$
Для шаблонов, предназначенных для соответствия только целым строкам, как этот, grep
также имеет параметр командной строки -x
.
Итак, пусть N равно 3. Соответствует ли наше регулярное выражение только строкам с 3 экземплярами /
?
$ cat << EOF | egrep -x '([^/]*/[^/]*){3}'
/
//
///
////
/stuff
/stuff/added
/stuff/added/
/stuff/added/to/
/stuff/added/to/each
/stuff/added/to/each/line
more/stuff
more/stuff/added
more/stuff/added/
more/stuff/added/to/
more/stuff/added/to/each
more/stuff/added/to/each/line
consecutive//slashes/
/consecutive//slashes/
/consecutive//slashes
///all in one place
all in one place///
all in ///one place
EOF
///
/stuff/added/
more/stuff/added/
consecutive//slashes/
/consecutive//slashes
///all in one place
all in one place///
all in ///one place
Да, кажется, что наше регулярное выражение соответствует правильным строкам. Теперь мы просто добавляем флаг -v
к , отфильтровываем совпадающие строки и отображаем строки, которые не совпадают.
$ cat << EOF | egrep -vx '([^/]*/[^/]*){3}'
/
//
///
////
/stuff
/stuff/added
/stuff/added/
/stuff/added/to/
/stuff/added/to/each
/stuff/added/to/each/line
more/stuff
more/stuff/added
more/stuff/added/
more/stuff/added/to/
more/stuff/added/to/each
more/stuff/added/to/each/line
consecutive//slashes/
/consecutive//slashes/
/consecutive//slashes
///all in one place
all in one place///
all in ///one place
EOF
/
//
////
/stuff
/stuff/added
/stuff/added/to/
/stuff/added/to/each
/stuff/added/to/each/line
more/stuff
more/stuff/added
more/stuff/added/to/
more/stuff/added/to/each
more/stuff/added/to/each/line
/consecutive//slashes/