2012-01-07 3 views
1

У меня очень простая путаница в отношении grep. Предположим, у меня есть следующий файл Grep в:Путаница в Linux команда grep

test.txt: 
This is an article 
from some newspaper 
Article is good 
newspaper is not. 

Теперь, если я Grep со следующим выражением

grep -P "is\s*g" test.txt 

Я получаю строку:

Article is good 

Однако, если я делаю это:

grep -P "is*g" test.txt 

Я не знаю вещь. Мой вопрос заключается в том, что asterix (*) является подстановочным знаком, который представляет 0 или более повторений предыдущего символа, не должен быть выход grep одинаковым. Почему ноль или более повторений 's' не дает никакого вывода?

Что мне здесь не хватает. Спасибо за помощь!

ответ

8

Потому что в вашем входе ничего нет, что соответствует i, затем 0 или более повторений s, затем g. «Статья хорошая» не может совпадать, потому что она имеет пробел после s, а не g. Образец is\s*g соответствует, потому что \s - это особый узор, который соответствует любому виду пробелов - так что общий шаблон is, тогда любое количество пробелов, затем g, что естественно соответствует «is g».

+0

Ох ... да, я понял это сейчас. Благодарю. – Richeek

+0

s * означает 0 или более повторений s, а не пространства, поэтому, конечно, это не будет соответствовать пробелу !! – Richeek

3

Я не вижу ig, isg, issg, issssg в вашем входе ...

Поскольку я не знаю, что вы хотели , чтобы соответствовать, вот моя догадка:

grep -P "is.*g" test.txt 
+0

Да, я смутился. Теперь я понимаю. – Richeek

1

Вы должны видеть регулярное выражение, прежде чем использовать Grep, и вы найдете его полезным с другими командами ... http://www.regular-expressions.info/

0

Это 0 или более повторений предыдущего регулярного выражения атома, и что атом \s , Таким образом, \s* может соответствовать табу-пробелу-табу-пространстве.

Смежные вопросы