Что означают эти различные части синтаксиса? - PullRequest
1 голос
/ 01 сентября 2011

Я пытаюсь выяснить синтаксис команды sed и сценария perl:

sed 's/^EOR:$//' INPUTFILE |
perl -00 -ne '/
TAGA01:\s+(.*?)\n
.*
TAGCC08:\s+(.*?)\n
# and so on
/xs && print "$1 $2\n"'

Почему в команде sed есть окружность ^?Третий слеш / заменит все экземпляры EOR: пустой строкой, верно?

Я понимаю некоторые из сценариев Perl.Глядя на perlrun, -00 будет slurp поток в режиме абзаца и -n запускает цикл while <>.

Почему первыйкосая черта / рядом с апострофом?Команда ищет TAGXXXX:, но я не уверен, что делает \s+(.*?).Это помещает то, что находится после тега в переменную?Как насчет .* в поиске между тегами?Что делает /ns?Что обозначают $1 и $2 в строке для печати?

Это было сложно найти в Интернете, и если бы кто-то ударил меня в правильном направлении, я был бы признателен.

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

дифрагмент ^ является регулярным выражением для «начала строки», а $ является регулярным выражением для «конца строки»;поэтому sed удалит только те строки, которые содержат в точности «EOR:» и ничего больше.

Сценарий Perl в основном perl -00 -ne '/(re)g(ex)/ && print "re ex\n"' с большим регулярным выражением ole вместо простого заполнителя, который я здесь поместил.В частности, модификатор /x позволяет разделить регулярное выражение на несколько строк.Таким образом, первый / является началом регулярного выражения, а последний / является концом регулярного выражения, а строки между ними образуют регулярное выражение.

Модификатор /s изменяет интерпретацию Perl . в регулярном выражении;обычно он соответствует любому символу, кроме новой строки, но с этой опцией он также включает и новые строки.Это означает, что .* может соответствовать нескольким строкам.

\s соответствует одному пробелу;\s+ соответствует как можно большему количеству пробельных символов, но должен быть хотя бы один.

(.*?) соответствует произвольной длине строки;точка соответствует любому символу, звездочка указывает ноль или более любого символа, а знак вопроса изменяет оператор повторения звездочки так, чтобы соответствовать как можно более короткой строке вместо максимально длинной строки.Скобки приводят к тому, что пропущенное выражение фиксируется в обратной ссылке;обратные ссылки называются $1, $2 и т. д., столько же, сколько существует обратных ссылок;числа соответствуют порядку открывающих скобок (поэтому, если вы примените (a(b)) к строке «ab», $1 будет «ab» и $2 будет «b»).

Наконец, \n соответствует буквальному переводу строки.Таким образом, не жадное совпадение (.*?) будет совпадать с первой новой строкой, то есть с хвостом строки, на которой было найдено что-то TAG.(Я полагаю, что это генные последовательности, а не «теги»?)

Нет смысла запускать sed отдельно;Perl вполне способен удалить строки EOR:, прежде чем пытаться найти соответствие регулярному выражению.

1 голос
/ 01 сентября 2011

Посмотрим ...

  1. Да, sed очистит строки с EOR:
  2. Первый / в скрипте Perl означает шаблон регулярного выражения. Конкретно, он ищет шаблон в форме ниже
  3. Регулярное выражение заканчивается на "xs", что означает, что регулярное выражение будет соответствовать нескольким строкам ввода
  4. Сценарий также будет выводить строки, найденные в тегах (см. Ниже). $1 и $2 означают элементы, содержащиеся в первой паре скобок ($1) и во второй ($2).

. Форма такая:

TAGA01:<spaces><string1>
<whatever here>
TAGCC00:<spaces><string2>

В этом случае $1 равно <string1> и $2 равно <string2>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...