Поиск X, но не Y в ed

Если вы должны использовать 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/
0
28.07.2021, 21:10
0 ответов

Теги

Похожие вопросы