Как я могу получить текст между определенными разделителями в переменную оболочки?

Вот действительно хороший постер от Microchip, который объясняет, как подключить ICD2.
Но имейте в виду, что ICD2 действительно старый и иногда немного хитрый. Новый ICD4 проще в использовании, а также намного быстрее.
Если вы хотите работать с заголовком, взгляните на этот документ . Он также включает в себя список доступных заголовков. Я не уверен, есть ли заголовок для PIC18 для ICD2.

6
задан Jonathan Leffler 28 March 2009 в 21:31
поделиться

10 ответов

Bash/sed:

VARIABLE=$(tr -d '\n' filename | sed -n -e '/\[[^]]/s/^[^[]*\[\([^]]*\)].*$/\1/p')

Если это нечитабельно, вот определенное объяснение:

VARIABLE=`subexpression`      Assigns the variable VARIABLE to the output of the subexpression.

tr -d '\n' filename  Reads filename, deletes newline characters, and prints the result to sed's input

sed -n -e 'command'  Executes the sed command without printing any lines

/\[[^]]/             Execute the command only on lines which contain [some text]

s/                   Substitute
^[^[]*               Match any non-[ text
\[                   Match [
\([^]]*\)            Match any non-] text into group 1
]                    Match ]
.*$                  Match any text
/\1/                 Replaces the line with group 1
p                    Prints the line
9
ответ дан 8 December 2019 в 05:58
поделиться

Позвольте мне указать, что, в то время как большинство предложенных решений могло бы работать, нет абсолютно никакой причины, почему необходимо разветвить другую оболочку и породить несколько процессов, чтобы сделать такую простую задачу.

Оболочка предоставляет Вам все инструменты, в которых Вы нуждаетесь:

$ var='foo[bar] pinch'
$ var=${var#*[}; var=${var%%]*}
$ echo "$var"
bar
6
ответ дан 8 December 2019 в 05:58
поделиться

Sed не необходим:

var=`egrep -o '\[.*\]' FILENAME | tr -d ][`

Но это - только работы с однострочными соответствиями.

3
ответ дан 8 December 2019 в 05:58
поделиться

Используя Bash встроенное соответствие regex походит на еще один способ сделать его:

var='foo[bar] pinch'
[[ "$var" =~ [^\]\[]*\[([^\[]*)\].* ]]   # Bash 3.0
var="${BASH_REMATCH[1]}"
echo "$var"
2
ответ дан 8 December 2019 в 05:58
поделиться

Принятие Вас спрашивает о переменной удара:

$ export YOUR_VAR=$(perl -ne'print $1 if /\[(.*?)\]/' your_file.txt)

Вышеупомянутые работы, если скобки находятся на той же строке.

1
ответ дан 8 December 2019 в 05:58
поделиться

Что относительно:

shell_variable=$(sed -ne '/\[/,/\]/{s/^.*\[//;s/\].*//;p;}' $file)

Работавший для меня на Солярисе 10 под оболочкой Korn; должен работать с 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, хлебая файл и редактируя строку результата в двух многострочных операциях замены.

1
ответ дан 8 December 2019 в 05:58
поделиться
var=`grep -e '\[.*\]' test.txt | sed -e 's/.*\[\(.*\)\].*/\1/' infile.txt`
0
ответ дан 8 December 2019 в 05:58
поделиться

Обратные косые черты (BSL) громко жевались...:

var='foo[bar] pinch' 
[[ "$var" =~ [^\]\[]*\[([^\[]*)\].* ]]   # Bash 3.0 
# Just in case ...: 
[[ "$var" =~ [^BSL]BSL[]*BSL[([^BSL[]*)BSL].* ]]   # Bash 3.0 
var="${BASH_REMATCH[1]}" 
echo "$var" 
0
ответ дан 8 December 2019 в 05:58
поделиться

Благодаря всем я использовал версию Strager и работаю отлично, большое спасибо еще раз...

var=`grep -e '\[.*\]' test.txt | sed -e 's/.*\[\(.*\)\].*/\1/' infile.txt`
0
ответ дан 8 December 2019 в 05:58
поделиться

2 простых шага для извлечения текста.

  1. var разделения в [и получает правильную часть
  2. var разделения в] и получает левую часть
cb0$ var='foo[bar] pinch'
cb0$ var=${var#*[}
cb0$ var=${var%]*} && echo $var
bar
0
ответ дан 8 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: