Доброго времени суток!
Есть строка вида:
kljfhgdfjk ; lfjkghdjkfgh && klfh&kdfgh
Пытаюсь sed-ом вытащить кусок строки идущий после последнего «&&» или ";" (смотря, что ближе к концу строки расположено). Делаю так:
echo 'kljfhgdfjk ; lfjkghdjkfgh && klfh&kdfgh' | sed -n 's/.*\(&&|;\)\ *\([^&{2},^;]*\)\ *$/\2/p'
Однако сия изящная конструкция ничего не возвращает. Даже ошибок. Пробовал последовательно упрощать регулярное выражение. Заработало следующее:
echo 'kljfhgdfjk ; lfjkghdjkfgh && klfh&kdfgh' | sed -n 's/.*&&\ *\([^&{2},^;]*\)/\1/p'
Возвращает, как и ожидается, «klfh&kdfgh», но в практических целях сия изящная конструкция непригодна, т.к. не охватывается вариант, когда после «&&» в строке есть ещё ";". Почему sed ничего не возвращает, если вместо «&&» в регулярном выражении поставить «\(&&|;\)» и заменять строку на вторую подгруппу вместо первой, неясно. Кроме того, непонятно, чем не нравится «\ *$», отсекающая пробелы в конце строки, в самом конце регулярного выражения. Что я делаю не так?