LINUX.ORG.RU

grep [^X]Y не показывает строки, в которых есть Y. не могу понять

Ты пытаешься игнорировать символ X. В твоём случае, думаю нужно несколько grep'ов скомбинировать.

ziemin ★★
()
Ответ на: комментарий от ziemin

Почему?

мне нуно строку,в которой есть и X и Y, но нет XY, причём X это regex на несколько десятков переменных, а Y тоже не лыком шит

teod0r ★★★★★
() автор топика
grep X | grep Y | grep -v XY
anonymous
()
Ответ на: комментарий от ziemin

grep X|Y
во-первых мне не нуна строка, в которой нет X
во вторых мне не нужно скрывать строку, в которой есть XY, если в ней есть X, но нет XY

teod0r ★★★★★
() автор топика
Ответ на: комментарий от beastie

Если бы речь шла о символах. Но ТС спрашивает о строках!

ziemin ★★
()

мне нуно строку, в которой есть и X и Y, но нет XY

egrep -v XY | egrep X | egrep Y
Очевидно же.

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от teod0r

Так что тебе именно нужно? Строка, где есть Y, но без XY? Строка, где есть и X, и Y, но нет XY? Или таки строка, где есть раздельные X и Y?
Выражайся яснее, а то нам не понятно.

quantum-troll ★★★★★
()
Ответ на: комментарий от ziemin

Опиши задачу

если в $* есть Y, но он не XYX;then ...
но в строке могут быть и X, и XYX, которые не должны вызывать then
then должен вызываться, если есть Y !=XYX

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Неправильный шаблон используешь!

если в $* есть Y, но он не XYX;then ... но в строке могут быть и X, и XYX, которые не должны вызывать then then должен вызываться, если есть Y !=XYX

Как написал, так и делай: Перед запуском регулярки проверяй исходные данные. Как-то так:

Проверить, что строка НЕ XYX (иначе пропустить).
Строка *Y*? Если да, то сравнить входную строку с X. если совпадает, то выкинуть

Как-то так. Извини, но я пьян. Завтра разговор будет продуктивнее.

ziemin ★★
()
Ответ на: комментарий от ziemin

Проверить, что строка НЕ XYX (иначе пропустить)
но в строке могут быть и X, и XYX

т.е в строке могут быть и X и XYX и Y

teod0r ★★★★★
() автор топика
Ответ на: комментарий от beastie

[^X]+Y
если ввести один Y - не работает почему-то

teod0r ★★★★★
() автор топика

Попробуй negative lookbehind:

grep -P -e '(?<!X)Y'

Для разбора аргументов getopts правильнее использовать, хотя здесь все от задачи зависит.

Array
()
Ответ на: комментарий от wwwsevolod

grep -P -e '(?<!X).*Y.*(?<!X)'

grep -P -e '(?<!X)\b+Y+(?<!X)\b'

осталось только понять, как поставить '/' и '=' заместо X. оно не работает, экранирование с \ не помогает, cast gv

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 4)
Ответ на: комментарий от gv

всё, разобрался:
grep -Pe '(?<![=,/])\b[a-z]*Y[a-z]*\b(?![=,/])'

если кому интересно для чего всё это:

#!/bin/bash
case $* in
*)
if [ `echo $*|grep -Pe '(?<![=,/])\b[a-z]*ключик[a-z]*\b(?![=,/])'|wc -l` != '0' ];then скрипт;fi
esac

позволяет использовать ключ, без 'тире' перед ним, при этом он может быть в связке с другими ключами, и определяется, не явяется ли он /путём и позволяет использовать заданние=переменных вместе с ключами

единственное - как использовать заместо [a-z]* переменную, чтобы она не сливаась с Y? $X\Y тут не работает

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 1)
Ответ на: комментарий от gv

спасибо. у меня ещё вопрос:
есть такой греп:
grep -Pe «^$Y( /.*){0,1}(( $Y)*( .*=.*)*( $Y{1,} /.*)*)*$»
проблема в том, что из-за .* подставляются вообще любые символы. как сделать, чтобы на месте '.*' были любые символы, кроме пробела? точнее нужно чтобы после ' /.*' могло быть только (( $Y)*( .*=.*)*( $Y{1,} /.*)*)*$

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 3)

Array gv
может ли grep -o из строки вида
=hghg ghg= ghg =g hgh g= tugdd=dytgdf hhg ghh g /hg /g
показать отдельные слова, в которых есть g, но нет / и =? или опция -o на такое не расчитана, и без sed'а тут не обойтись? пробовал и grep -o '[^ /= ]*g[^ /= ]*' и
grep -Po '(?<![ ,/,=])\b[a-z]*g[a-z]*\b(?![ ,/,=])', но либо я что-то не так делаю, либо -o работает не так как я ожидал

teod0r ★★★★★
() автор топика
Последнее исправление: teod0r (всего исправлений: 1)
Ответ на: комментарий от teod0r
grep -Po '(?<= |^)[^ /= ]*g[^ /= ]*(?= |$)'

Читайте Camel Book :)

gv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.