Как найти альтернативные окончания для строки - PullRequest
3 голосов
/ 24 марта 2011

Итак, предположим

(1)

Я хочу добавить следующее:

Germania Немецкий germanland

из этого списка:

Germania Немецкий germanland germanistan germanburg

Как мне это сделать с помощью grep?

(2)

Я хочу получить строку, начинающуюся с «abcd», затем посередине, а затем «xkcd». Посередине может идти что угодно, , кроме"foobar".

Как мне это сделать с помощью grep?

Очень ценится!

Ответы [ 5 ]

3 голосов
/ 24 марта 2011

Команда sed ниже просто разбивает строку на строки:

echo "germania german germanland germanistan germanburg" | sed -e 's/\ /\n/g' | grep -E "german*(ia|land|)$"

Это было проверено в командной строке bash.

Важная часть дляyou is: grep -E "german(ia|land)*$"

-E означает интерпретировать PATTERN как расширенное регулярное выражение.Знак * означает найти 0 или более совпадений для слов, заканчивающихся на ia ИЛИ land. для слов, заканчивающихся понятием , представлен знаком $ в конце.

Это хорошие ресурсы по grep и регулярным выражениям: linuxquestions и cyberciti .

1 голос
/ 08 июня 2012

Старый вопрос, но я все равно прокомментировал. Ответ Карлфилипа работает, но имеет побочный эффект разделения строки на несколько строк и повторения их по отдельности. Я не уверен, что этого хочет Дениз.

То, как я читаю вопрос, заключается в том, что он хочет, чтобы grep нашел строку, если она содержит какие-либо вхождения в слова "немецкий", "германия" или "германия".

Это решение похоже, но не выполняет разбиение:

$ echo "germanialand germanistan germanburg germania" | grep -E "\<german(ia|land|)\>"
germanialand germanistan germanburg germania

$ echo "germanistan germanburg germaniaburg" | grep -E "\<german(ia|land|)\>"
$
1 голос
/ 25 марта 2011

На ваш второй вопрос:

grep -v 'abcdfoobarxkcd' | grep 'abcd.*xkcd'
0 голосов
/ 08 июня 2012

Относительно второго вопроса: lngo в основном корректен, за исключением того, что он хочет, чтобы строка начала с "abcd" и конца с xkcd.

Я интерпретируювопрос немного по-другому в том, что я думаю, что он хочет исключить что-нибудь между открытием (abcd) и закрытием (xkcd), в котором есть foobar, а не only foobar.

grep '^abcd.*xkcd$' | grep -v foobar
0 голосов
/ 25 марта 2011

Недостаточно информации для первого вопроса, поскольку вы хотите получить первые 3 поля, а затем просто

awk '{print $1,$2,$3}' file

для второго вопроса,

awk '/^abcd.*xkcd/ && !/foobar/' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...