2016-07-08 5 views
0

Я борюсь с этой проблемой. У меня есть этот текст:Получите текст между двумя словами в bash (multilines)

Executables: manatee-curl 
Dependencies: base ==4.*, manatee-core >=0.1.1, dbus-client ==0.3.*, 
       stm >=2.1.2.0, containers >=0.3.0.0, gtk >=0.12.0, 
       text >=0.7.1.0, mtl >=1.1.0.2, old-time -any, 
       old-locale -any, glib >=0.12.0, gio >=0.12.0, 
       filepath >=1.1.0.3, utf8-string >=0.3.4, bytestring -any, 
       network -any, curl >=1.3.7, directory -any, 
       template-haskell -any, derive -any, binary -any, 
       regex-tdfa -any, dbus-core -any 
Cached:  No 

и я хочу, чтобы получить все эти слова между «зависимостями:» и «Сохраненная копия». вы можете рассматривать этот текст как переменную, например:

echo $ text | Grep/DoStuff/

Чтобы было ясно, выход я хочу, чтобы это:

base ==4.*, manatee-core >=0.1.1, dbus-client ==0.3.*, 
stm >=2.1.2.0, containers >=0.3.0.0, gtk >=0.12.0, 
text >=0.7.1.0, mtl >=1.1.0.2, old-time -any, 
old-locale -any, glib >=0.12.0, gio >=0.12.0, 
filepath >=1.1.0.3, utf8-string >=0.3.4, bytestring -any, 
network -any, curl >=1.3.7, directory -any, 
template-haskell -any, derive -any, binary -any, 
regex-tdfa -any, dbus-core -any 

Спасибо.

ответ

0

С GNU Grep:

echo "$text" | grep -Poz 'Dependencies: \K(.*\n)*(?=Cached:)' | grep -Po '^ +\K.*' 

Выход:

 
base ==4.*, manatee-core >=0.1.1, dbus-client ==0.3.*, 
stm >=2.1.2.0, containers >=0.3.0.0, gtk >=0.12.0, 
text >=0.7.1.0, mtl >=1.1.0.2, old-time -any, 
old-locale -any, glib >=0.12.0, gio >=0.12.0, 
filepath >=1.1.0.3, utf8-string >=0.3.4, bytestring -any, 
network -any, curl >=1.3.7, directory -any, 
template-haskell -any, derive -any, binary -any, 
regex-tdfa -any, dbus-core -any 

См: The Stack Overflow Regular Expressions FAQ

0

Вы можете использовать sed, чтобы получить текст между 2 моделей:

text=$(sed -n '/^Dependencies:/,/^Cached:/{$d;s/Dependencies: *//;p;}' file) 

echo "$text" 

base ==4.*, manatee-core >=0.1.1, dbus-client ==0.3.*, 
       stm >=2.1.2.0, containers >=0.3.0.0, gtk >=0.12.0, 
       text >=0.7.1.0, mtl >=1.1.0.2, old-time -any, 
       old-locale -any, glib >=0.12.0, gio >=0.12.0, 
       filepath >=1.1.0.3, utf8-string >=0.3.4, bytestring -any, 
       network -any, curl >=1.3.7, directory -any, 
       template-haskell -any, derive -any, binary -any, 
       regex-tdfa -any, dbus-core -any 

IDEOne Working Demo

+0

Извините, но это не работает, когда я пытаюсь вывода $ текста я просто ничего не получить ... :( –

+1

@ChristopherLoen пожалуйста, указать, какие 'sed' ... линукс дифф чем по умолчанию OSX, например – nhed

+0

Это был протестирован на OSX sed, а также на GNU sed – anubhava

0

awk на помощь!

$ awk '/^Dependencies:/{$1="";p=1} /^Cached:/{p=0} p{sub(/^ +/,"");print}' file 

base ==4.*, manatee-core >=0.1.1, dbus-client ==0.3.*, 
stm >=2.1.2.0, containers >=0.3.0.0, gtk >=0.12.0, 
text >=0.7.1.0, mtl >=1.1.0.2, old-time -any, 
old-locale -any, glib >=0.12.0, gio >=0.12.0, 
filepath >=1.1.0.3, utf8-string >=0.3.4, bytestring -any, 
network -any, curl >=1.3.7, directory -any, 
template-haskell -any, derive -any, binary -any, 
regex-tdfa -any, dbus-core -any 

можно присвоить переменной, как обычно

$ text=$(awk ...)