2013-03-15 4 views
0

Вот мой вопрос:оболочки и сопоставления регулярных выражений пространства

например

echo 123\< abc\\\ efg 

Выход должен быть

123< abc\ efg 

Моя регулярное выражение в ЛЕКС файле

[^\n ]*[\\]+[^\n] 

Если я используйте это регулярное выражение, мой вывод будет

123< abc\ efg 

который не прав. Может ли кто-нибудь сказать мне, как соответствовать \ (пробелу) и правильному (пробелу) соответственно?

Спасибо!

+0

Обратите внимание, что существует разница между 'echo 123 \ chepner

+0

Я перенаправил 123 \ Lamian

ответ

0

Ваше регулярное выражение является правильным. При вводе в командной строке

echo 123\< abc\\\ efg 

происходит следующее:

  1. bash заменяет \< с < (без обратной косой черты, bash будет относиться к < как в оператора перенаправления ввода

  2. bash. заменяет \\ единственным литералом \

  3. bash заменяет '\ `единственным пространством литерала.

  4. bash вызывает команду echo, передавая ему 2 аргумента: 123< и abc\ efg.

  5. echo производит вывод 123< abc\ efg, одну строку с одним пространством, разделяющим его два аргумента.

Основываясь на вашем регулярном выражении, похоже, что вывод строки в моем шаге 5 выше - это то, что хранится в вашем файле. Из этих 13 байт он найдет 3 действительных токена: 123<, abc\ и efg. Если он печатает их на стандартный вывод в виде одной строки с пространством, разделяющим каждый токен, вы увидите 123< abc\ efg. (Должно быть два пробела, следующие за обратным слэшем, я не могу получить несколько пробелов для отображения.)

+0

Да. Лексер разделит 123 \ Lamian

1

Я считаю, что то, что вы ищете, является гибким регулярным выражением, которое будет соответствовать единственному токену оболочки, содержат цитаты или другие подобные осложнения.

Обратите внимание, что символы, которые автоматически завершают токены, являются следующими: ();<>&| и пробелы. (Руководство bash говорит space и tab, но я уверен, что newline также отдельные слова.)

Такое регулярное выражение возможно, но (imho) оно малопригодно, отчасти потому, что оно не принимает кавычки (или брекетинг: a$(echo foo)b - это одно слово), а отчасти потому, что результирующее слово должно быть rescanned для escape-символов. Но что угодно. Вот пример гибкое регулярное выражение:

([^();<>&|\\[:space:]]|\\(.|\n))+ 

Это соответствует любому количеству последовательных экземпляров:

  • ничего, кроме метасимвола или экранирующего символа, или
  • символа экранирования следует любому одиночному символ , или
  • escape-символ, за которым следует новая строка.
Смежные вопросы