СЭД для простых замен на отдельных линиях, для чего-то более интересного вы должны использовать AWK:
$ awk -v beg="process.get('name1')" -v end="process.get('name6')" \
'index($0,beg){f=1} f; index($0,end){f=0}' file
process.get('name1')
process.get('name2')
process.get('name3')
process.get('name4')
process.get('name5')
process.get('name6')
Обратите внимание, что вы могли бы использовать диапазон в AWK, так же, как вы вынуждены в СЭД:
awk -v beg="process.get('name1')" -v end="process.get('name6')" \
'index($0,beg),index($0,end)' file
, и вы можете использовать регулярные выражения после побега metachars в AWK, так же, как вы вынуждены в СЭД:
awk "/process\.get\('name1'\)/,/process\.get\('name6'\)/" file
но первая версия AWK выше, используя строки вместо регулярных выражений и переменная флага проще (в той мере, вам не нужно определять, какие символы являются/не являются метасимволами RE), более надежными и более легко расширяемыми в будущем.
Важно отметить, что sed НЕ МОЖЕТ работать с строками, просто с регулярными выражениями, поэтому, когда вы говорите «Я хочу найти строку», вы должны перестать пытаться заставить sed вести себя так, как если бы он мог это сделать.
Представьте, что ваши строки поиска переданы в сценарий как позиционные параметры $1
и $2
. С AWK вы бы просто инициализировать переменные AWK из них ожидаемым образом:
awk -v beg="$1" -v end="$2" 'index($0,beg){f=1} f; index($0,end){f=0}' file
в то время как с СЭД вы должны сделать что-то вроде:
beg=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< "$1")
end=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< "$2")
sed -n "/^${beg}$/,/^${end}$/p" file
деактивировать любые метасимволы присутствующих. См. Is it possible to escape regex metacharacters reliably with sed для получения подробной информации об экранировании метаданных RE для sed.
Наконец - как уже упоминалось выше, вы можете использовать выражение диапазона со строками в AWK:
awk -v beg="$1" -v end="$2" 'index($0,beg),index($0,end)' file
, но лично я никогда не находил, что полезно, всегда есть некоторые незначительные изменения требований приходит, чтобы заставить меня пожелать я d начал использовать флаг. См. Is a /start/,/end/ range expression ever useful in awk? для получения более подробной информации об этом
Почему 'index' вместо' $ 0 ~ '? – 123
, потому что index() работает с строками вместо регулярных выражений, поэтому вам не нужно избегать метасимволов RE, чтобы использовать его, чтобы он был более простым и надежным для такого случая, когда OP явно хочет просто искать литеральные строки. –
хорошо, круто спасибо – 123