2015-01-14 3 views
1

Я хочу найти текст, который находится между двумя словами, и эти два слова не совпадают, оба присутствуют на разных строках, поэтому я хочу найти строки (текст линий), которые приходят между словамиПолучите текст между двумя словами, используя sed

Например:

example-a, pqr- 411 037.   ] .. abc. 

V/s. 

xyz abc Transports Ltd.,   ] 
517, E, M. G. road,     ] 
hhhh.        ] ..pqr. 

I am doing the testing for example: 
example.com 

Теперь я хочу, текст, который приходит после V/s. до ...pqr следующей строки и ..pqr следующей строки является пустой строкой.

sed -nr '/v[/s]\.*/I{ :loop; n; /\.\.pqr/Iq; p; b loop}' input_file.txt Я использовал

Но его предоставление текста до hhhh. ] ..pqr но я хочу следующую строку и как я мог бы добиться этого с SED команды?

ответ

1

Я думаю

sed -nr '/V\/s\.*/I { :loop; n; p; /\.\.pqr/I { :loop2; n; p; // b loop2; /^\s*$/ q }; b loop}' foo.txt 

является наиболее простой адаптации.

То есть:

/^V\/s/I {  # starting in a line that starts with v/s 
       # (you can go back to your old pattern if my guess about the 
       # precise criteria you want here is incorrect) 
    :loop 
    n   # fetch the next line 
    p   # print it 
    /\.\.pqr/I { # if it contained ..pqr 
    :loop2 
    n   # fetch 
    p   # and print lines 
    // b loop2 # until one does not contain ..pqr (// repeats the previous regex) 
       # this inner loop is necessary in case there are two lines 
       # containing ..pqr at the end of a section. 
    /^\s*$/ q # and if that line was empty, quit. 
    } 
    b loop  # loop until then 
} 

Я изменил картину в начале, потому что мне кажется, что v[/s]\.* является результатом догадок, пока правильно не случилось с excample файлом. v[/s]\.* будет соответствовать v/., vs., v/... и vs..., но не v/s. - [] обозначают набор символов, из которых любой может соответствовать, а не последовательность - [/s] матчи либо / или s.

Образец, который я установил, будет соответствовать v/s в начале строки. В качестве альтернативы (в зависимости от ваших потребностей) вы можете использовать /v\/s/I, который будет соответствовать v/s в любом месте линии, или, возможно, /^v\/s\.*$/, который будет соответствовать только строкам, состоящим в основном из v/s, за которым следует произвольное количество периодов.

Помните, что все это догадки, потому что я точно не знаю, что однозначно идентифицирует начало раздела в вашем файле.

0
sed -n '\#V/s\.#,/\.\.pqr/ { 
    \#V/s\.# b 
    /\.\.pqr/ n 
    p 
    }' YourFile 

печатать все строки для ВСЕХ секций начиная линию рядом с V/s. до первой строки после первой pqr... на другую линию.

0

я бы использовал awk так:

awk '/V\/s\./ {f=1} /\.\.pqr/ && f {a=1} !NF && a {f=a=0} f' file 
V/s. 

xyz abc Transports Ltd.,   ] 
517, E, M. G. road,     ] 
hhhh.        ] ..pqr. 

Это будет печатать с найденной Vs. до ..pqr и следующая строка пуста.

Как это работает:

awk ' 
/V\/s\./ {f=1}   # If "Vs." is found set flag "f" 
/\.\.pqr/ && f {a=1} # If "..pqe" is found and flag "f" is true, set flag "a" 
!NF && a {f=a=0}  # If line is blank and "a" is true clear all flags 
f      # If flag "f" is true print the line. 
' file 
Смежные вопросы