Как использовать переменную в шаблоне поиска sed - PullRequest
2 голосов
/ 12 марта 2012

Я покажу пример, чтобы объяснить мою проблему.

VARIABLE='some string'

Я хочу найти строку в файле, например:

sed -n "/$VARIABLE,test/p" aFile

Я знаю, что это неправильно, потому что идентификатор переменной "$" конфликтует с шаблоном perl $, что означает конец строки.

Итак, мой вопрос: есть ли способ использовать переменную в поиске sed patter?

1 Ответ

4 голосов
/ 12 марта 2012

Похоже, вы пытаетесь использовать обозначение диапазона sed, т.е. / start /, / end / ?.Это правильно?

Если это так, все, что вам нужно сделать, это добавить дополнительные символы '/', которые отсутствуют, т.е.

sed -n "/$VARIABLE/,/test/p" aFile

Диапазон может состоять из номеров строк, строк /регулярные выражения и / или относительные номера строк (без оглядки назад).

 sed -n "1,20p" aFile
 # prints lines 1-20 

 sed -n '/start/,/end/p' aFile
 # prints any text (include current line)
 # with start until it finds the word end

 sed -n '/start/,+2p' aFile
 # prints line matching start and 2 more lines after it

Я использую строки в шаблоне /regex/, чтобы упростить объяснение.Вы можете делать настоящие рекс-экс как /^[A-Za-z_][A-Za-z0-9_]*/ и т. Д., Когда вы узнаете о них.

Также за ваш комментарий о '$', sed также будет использовать '$' в качестве индикатора 'end-of-line 'ЕСЛИ символ виден в reg-ex, который оценивается.Также обратите внимание, как некоторые из моих примеров используют dbl-кавычки ИЛИ одинарные кавычки.Одинарные кавычки означают, что ваше выражение sed -n '/$VARIABLE/,/test/p' aFile будет соответствовать буквенным символам AND, так как $ не находится в конце регулярного выражения, оно будет использоваться как обычный символ.'$' Применяется только как конец строки, когда он находится в конце reg-ex (part);например, вы могли бы сделать /start$|start2$/, и оба из них означали бы конец строки.

Как уже отмечали другие, ваше использование

sed -n "/$VARIABLE/,/test/p" aFile

конвертируется через оболочкупеременное выражение в

sed -n "/some text/,/test/p" aFile

ТАК, если вы хотите, чтобы ваш текст был закреплен в конце строки, вы можете написать

sed -n "/$VARIABLE$/,/test/p" aFile 

, который расширяется до

sed -n "/some text$/,/test/p" aFile

Надеюсь, это поможет

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