2016-06-30 3 views
-1

Я пытаюсь найти что-то в файле с шаблоном с помощью '*', но не работает, любая идея, как это сделать?Как grep '*' в оболочке unix korn

это то, что я пытаюсь сделать:

grep "files*.txt" $myTestFile 

не что-либо возвращение, это предположить, что «*» должны быть все.

+0

Да, работайте как grep 'files *' $ myTestFile, но не с .txt в конце –

+1

Вы имеете в виду, что буквально нужно соответствовать 'files * .txt', или это также может быть, скажем,' filesfoo.txt '? И вы имеете в виду '.' в смысле glob, где он соответствует только буквенному'.'или в смысле регулярного выражения, где он соответствует любому символу? В этом смысле, вы имеете в виду '*' в смысле регулярного выражения, где это означает «0-или-больше' '' '' '' 'или в шаблоне, где это означает« соответствовать чему-либо »? –

+1

Ничего особенного ksh здесь, кстати, за исключением того, что вы используете оболочку, которая следует за правилами расширения POSIX с использованием '$ myTestFile' без окружающих кавычек, является ошибкой (попробуйте передать имя файла с пробелами таким образом). Поведение «grep» определяется вашей операционной системой, а не вашей оболочкой, говорящей нам, какая у вас оболочка не дает много подсказок о том, какой у вас «grep». –

ответ

1

По умолчанию grep не поддерживает расширенный регулярный экспресс, но Grep -E или делают задать расширенные.

"файлы задать расширенное. * \. .txt" $ myTestFile

или

GREP -E "файлы. * \. .txt" $ myTestFile

В Кроме того, доступны три варианта программ egrep, fgrep и rgrep. egrep - это то же самое, что и grep -E. fgrep - это то же самое, что и grep -F. rgrep - это то же самое, что и grep -r. Прямой вызов либо egrep, либо fgrep устарел, но предоставляется, чтобы исторические приложения полагались на них для запуска без изменений.

Matcher Selection 
     -E, --extended-regexp 
       Interpret PATTERN as an extended regular expression (ERE, see below). (-E is specified by POSIX.) 

     -F, --fixed-strings 
       Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.) 

     -G, --basic-regexp 
       Interpret PATTERN as a basic regular expression (BRE, see below). This is the default. 

     -P, --perl-regexp 
       Interpret PATTERN as a Perl regular expression (PCRE, see below). This is highly experimental and `grep -P` may warn of unimplemented features. 
+0

Решение от Джонатана и Цзянти работает для меня! благодаря! –

1

Если вы хотите, чтобы соответствовать точной строке files*.txt, это было бы:

# match exactly "files*.txt" 
grep -e "files[*][.]txt" "$myTestFile" 

... или, проще говоря, используя fgrep сопоставлением только точная строка Дано:

# match exactly "files*.txt" 
fgrep -e 'files*.txt' "$myTestFile" 

[*] определяет класс символов только с одним символом - * - содержит и, таким образом, соответствует только одному символу. Также возможно экранирование с обратным слэшем, но может иметь разные значения в разных контекстах и, следовательно, менее надежным.


Если вы хотите, чтобы соответствовать любой строке, которая содержит files, а позже .txt, то:

# match any line containing "files" and later ".txt" 
grep -e "files.*[.]txt" "$myTestFile" 

.* соответствует нулевой или-больше символов, и является, таким образом, регулярное выражение эквивалентно глобальном масштабе осуществление образец *. Аналогично, в то время как в шаблоне glob . соответствует только самому себе, в регулярном выражении . может соответствовать любому символу, поэтому . в .txt должен быть экранирован, как в [.]txt, чтобы он не соответствовал чему-либо еще.

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