2016-01-19 3 views
0

Мой пример текста,Как извлечь строки после основания определенной строки

AA BB CC 
DDD 
process.get('name1') 
process.get('name2') 
process.get('name3') 
process.get('name4') 
process.get('name5') 
process.get('name6') 
EEE 
FFF 
... 

Я хочу, чтобы искать строку «process.get („“) name1» первым, если найден затем извлечь строки из "process.get ('name1')" to "process.get ('name6')".

Как извлечь строки с помощью sed?

ответ

3

Это должно работать и ... он использует СЭД согласно запросу OP:

$ sed -n "/^process\.get('name1')$/,/^process\.get('name6')$/p" file 
2

СЭД для простых замен на отдельных линиях, для чего-то более интересного вы должны использовать 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? для получения более подробной информации об этом

+0

Почему 'index' вместо' $ 0 ~ '? – 123

+1

, потому что index() работает с строками вместо регулярных выражений, поэтому вам не нужно избегать метасимволов RE, чтобы использовать его, чтобы он был более простым и надежным для такого случая, когда OP явно хочет просто искать литеральные строки. –

+1

хорошо, круто спасибо – 123

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