А как же:
shell_variable=$(sed -ne '/\[/,/\]/{s/^.*\[//;s/\].*//;p;}' $file)
работал у меня на солярисе 10 под оболочкой корна; должен работать и с Bash. Замените '$(...)
' обратными галочками в оболочке Bourne.
Редактировать : работает, когда задано [в одной строке и] в другой. Для случая с одной строкой используйте:
shell_variable=$(sed -n -e '/\[[^]]*$/,/\]/{s/^.*\[//;s/\].*//;p;}' \
-e '/\[.*\]/s/^.*\[\([^]]*\)\].*$/\1/p' $file)
Первый '-e
' относится к многострочному спреду; второй '-e
' относится к случаю с одной строкой. Первый '-e
' говорит:
- Из строки, содержащей открытую скобку
[
, за которой не следует закрывающая скобка ]
в той же строке
- До строки, содержащей закрывающую скобку
]
,
- заменить все, вплоть до открытой скобки, пустой строкой,
- заменить что-либо от закрывающей скобки и далее пустой строкой, а
- распечатать результат
Второй '-e
' говорит:
- Для любой строки, содержащей как открытую, так и закрытую скобку
- Замените шаблон, состоящий из «символов до и включая открытую скобку», «символов до, но исключая закрывающую скобку» (и помните об этом), «вещи из закрывающей скобки и далее» с запомненными символами в середине и
- распечатать результат
Для многострочного корпуса:
$ file=xxx
$ cat xxx
sdsajdlajsdl
asdajsdkjsaldjsal
sdasdsad [aaaa
bbbbbbb
cccc] asdjsalkdjsaldjlsaj
asdjsalkdjlksjdlaj
asdasjdlkjsaldja
$ shell_variable=$(sed -n -e '/\[[^]]*$/,/\]/{s/^.*\[//;s/\].*//;p;}' \
-e '/\[.*\]/s/^.*\[\([^]]*\)\].*$/\1/p' $file)
$ echo $shell_variable
aaaa bbbbbbb cccc
$
А для однострочного корпуса:
$ cat xxx
sdsajdlajsdl
asdajsdkjsaldjsal
sdasdsad [aaaa bbbbbbb cccc] asdjsalkdjsaldjlsaj
asdjsalkdjlksjdlaj
asdasjdlkjsaldja
$
$ shell_variable=$(sed -n -e '/\[[^]]*$/,/\]/{s/^.*\[//;s/\].*//;p;}' \
-e '/\[.*\]/s/^.*\[\([^]]*\)\].*$/\1/p' $file)
$ echo $shell_variable
aaaa bbbbbbb cccc
$
Где-то здесь, становится все проще выполнять всю работу в Perl, отрывая файл и редактируя строку результата в двух многострочных операциях замены.