2013-08-05 3 views
-1

У меня есть быстрый вопрос:

Предположим, что у меня есть файл содержит:

abc$ 
$ 
$abc 

, а затем я использую Grep "с \ $" имя файла, а затем я получил только абв $. Но если я использую grep «c \\ $», я получил abc $.

Я очень смущен, не слэш назад уже выключить особое значение $? Итак, имя файла grep "c \ $" возвращает мне строку abc $?

Действительно надеюсь, кто может любезно дать мне некоторое предложение.

Большое спасибо заранее.

+0

Используйте 'grep 'c \ $'' (одинарная кавычка), чтобы получить 'abc $'. – fedorqui

+0

@fedorqui Спасибо за ваш быстрый ответ. Но в чем разница между двойной кавычкой и одинарной кавычкой? –

ответ

1

Если вы склонны думать, что $ нужно экранировать, то это не так.

С GNU grep manual, вы бы понять:

мета-символы, которые должны быть экранированы при использовании основные регулярные выражения ?, +, {, |, ( и ).

+0

Стоит отметить, что, возможно, его нужно экранировать или помещать в одинарные кавычки, чтобы предотвратить действие * shell *. – nneonneo

+0

@nneonneo Да, я согласен с тобой –

+0

@devnull Спасибо всем. Но я думаю, что $ нужно бежать несколько раз. –

1

Двойные кавычки отбрасывают вас. Это позволяет оболочке расширять метасимволы. На моей коробке Linux, используя только одиночные кавычки:

$ grep 'abc$' <<<'abc$' 
$ grep 'abc\$' <<<'abc$' 
$ grep 'abc\$' <<<"abc$" 
abc$ 
$ grep 'abc$' <<<'abc$' 
$ grep 'abc\\$' <<<'abc$' 
$ 

Обратите внимание, что в пяти командах выше, что только grep нашел образец (и напечатанной его) было abc\$. Если я не избежал $, он предположил, что я искал строку abc, которая была привязана к концу строки. Когда я положил одну обратную косую черту перед $, она распознала $ как буквенный символ, а не как конец строки.

Обратите внимание, что $ в качестве концевого якоря имеет интеллект. Если я ставлю $ в середине регулярного выражения, это регулярный характер:

$ grep 'a$bc' <<<'a$bc' 
a$bc 
$ grep 'a\$bc' <<<'a$bc' 
a$bc 

Здесь он нашел символьную строку a$bc ли не избежал я в $.

Пробовал вещи с двойными кавычками:

$ grep "abc\$" <<<'abc$' 
$ grep "abc\\$" <<<'abc$' 
abc$ 

Единственный \ избежал $ как конец строки якоря. Положив два \\ перед избежала $ как не оболочки мета-символ и как регулярное выражение буквальным.

+0

Привет, Дэвид, большое вам спасибо за это !!!! Таким образом, $ имеет особое значение, когда оно помещается в конец регулярного выражения, правильно ли оно? –

+1

@DavidDai Официально: это зависит от библиотеки регулярных выражений, которую вы используете. '' 'Имеет официальный смысл, и он должен быть _quoted_, когда вам нужен литерал' $ '. Тем не менее, каждая библиотека регулярных выражений, которую я видел, позволяет использовать '$' в середине строки без backquotes. То же самое с '^', который является началом линейного якоря. В конце концов, если '' 'не находится в конце, а'^'не в начале, их назначение в качестве якорей довольно бессмысленно. –

+0

Привет, Дэвид, спасибо за ваш быстрый ответ. Я очень ценю это. Да, это имеет смысл. Вы действительно помогаете. : P –

0

Я предложил бы использовать fgrep если вы хотите искать буквального $ и избежать побега $ (что означает конец строки):

fgrep 'abc$' <<< 'abc$' 

дает этот вывод:

abc$ 

PS:fgrep такой же, как grep -F и в соответствии с man grep

-F, --fixed-strings Интерпретировать PATTERN как список фиксированных строк, разделенных символами новой строки, любой из которых должен быть сопоставлен.

+0

Привет, спасибо за ваш быстрый ответ. Да, fgrep также является хорошей идеей, хотя я ищу какое-то предложение grep. Тем не менее, спасибо вам все равно –

+0

Вы также можете использовать 'grep -f 'abc $'' – anubhava

0

Знак $ имеет особое значение в регулярных выражениях шаблонов как конца строки, поэтому, когда вы используете двойные кавычки

grep "c\$"

строка расширяется в виде двух символов c и $ и grep думают, что это выражение regexp c'mon, найти все строки с 'c' в конце.

В случае опалить кавычки, все символы рассматриваются как каждого из них, то есть команда

grep 'c\$'

будет иметь три символа c, \ и $. Таким образом, grep получит все эти символы на своем входе, и поэтому он получает специальный символ $, т. Е. Как \$ и выполняет то, что вы ожидали.

+0

Спасибо Rook. Это здорово! Итак, когда мы должны использовать одинарную цитату или двойную кавычку? Пожалуйста, предложите. : D –

+0

@DavidDai с использованием двойных или одинарных кавычек для вашего предпочтения или стиля кода ограничения проекта или просто ситуативного: например.если вы хотите использовать переменные в ваших текстовых строках, вам придется использовать двойные кавычки, и если вы хотите использовать текст, который уже содержит слова или фразы с двойным кавычком, лучше использовать одиночные qout, а не избегать его. Если у вас есть далеко идущие планы, то одиночные qoutes будут пересмотрены для работы с разметкой HTML/XML или объектами JSON, которые в значительной степени дублируются внутри :) – rook

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