2014-09-09 3 views
0


У меня есть следующий входной файл:
Как объявлять переменные внутри СЭД

This is just junk 
stuff this should not 
appear in the output 
module instance1 (
.a (x), 
.b (y), 
.c (z) 
); 
Module instance2 (
.a (x), 
.b (y), 
.c (z) 
); 
So is this part of the 
file so no output here 
as well`<br> 
I want the following output:<br> 
`module instance1 ( 
.a (x), 
.b (y), 
.c (z) 
); 
Module instance2 (
.a (x), 
.b (y), 
.c (z) 
); 


Я попытался запустить следующий сценарий:

#!/bin/bash 
block=`sed -n '/($/p' test1 
echo $block 
for bloc in "$block"; do 
sed -n "/$bloc/,/);/{p}" test1 
done 

Но я получаю следующее сообщение об ошибке:
sed: -e expression #1, char 19: unterminated address regex
Но почему этот сценарий не работает?
Edit: test1 является входной файл показано выше

+0

Ваш 'sed' команда не закрыта. В ** block = 'sed -n '/ ($/p' test1 ** отсутствует закрытие ('). – Ambrish

+0

Там я ищу строку, заканчивающуюся ( – sarthak

+1

'для блока в« $ block »' может только когда цикл «$ block» является одной строкой. –

ответ

2

Когда оболочка расширяется $bloc внутри СЕПГ скрипта заканчивается:

sed -n "/module instance1 (
Module instance2 (
Module instance2 (/,/);/{p}" test1 

Который, как вы можете себе представить, что это не слишком доволен.

Если вы хотите sed распечатать только строки между module .... ( и ); затем просто сделать это прямо, вместо того, чтобы играть в эту игру

sed -n '/^[mM]odule .* ($/,/);/p' 

Если вам нужно их в отдельные файлы или что-то, то вам необходимо исправить как вы найти имена модулей и перекручивание над исходными линиями

+0

Мне нужно использовать переменные в sed, потому что я хочу сделать обобщенный скрипт не специально для этого файла примера. Не могли бы вы рассказать мне, как это сделать с переменной – sarthak

+0

Использование переменных в вашем скрипте 'sed' это не проблема, но содержимое этих переменных может быть. Они не могут содержать ничего, что не было бы законным, если бы вы ввели его в этой части скрипта 'sed' (поскольку это все, что делает оболочка). Таким образом, вы можете использовать разделитель, который не будет конфликтовать, и вы получите доступ к содержимому переменной для чего-либо, другие проблемы. –

+0

для цикла присваивает разные значения в $ block to $ block, которые ограничены пробелом. Можем ли мы изменить этот разделитель на новую строку? – sarthak

-1
sed -n "/${bloc:-^}/,/);/ {p;}" test1 
  • добавить ; в блок действий (или добавьте новую строку, если хотите)
  • return ^ если блок пуст или пуст. Это избежать // шаблон

Test

bloc='Module instance2 (' 
sed -n "/${bloc:-^}/,/);/ {p;}" YourFile 

Module instance2 (
.a (x), 
.b (y), 
.c (z) 
); 
Module instance2 (
.a (x), 
.b (y), 
.c (z) 
); 
+0

почему -1? любое объяснение – NeronLeVelu