var="<string> 1.11 </string>"
Я хочу избавиться от <string>
и </string>
Как я могу сделать это?
На данный момент я получил это:
var=${var:9:4}
1.11
Вы могли использовать sed
для обработки строк:
echo '$var = <string> 1.11 </string>' | sed -r 's/<string>(.*)<\/string>/\1/g'
возвраты
$var = 1.11
Объяснение sed
конструкция:
sed -r # call sed with regex-option (-r)
's/ # begin of regex (s means "replace, / is the seperator)
<string>(.*)<\/string> # construct that should be replaced (the / has to be escaped with \ here)
/ # seperator
\1 # replacement string (\1 means "whatever is matched between the () before")
/g' # apply replacement globally (in case it occurs multiple times in the string)
Я использую другое решение:
echo '$var = <string> 1.11 </string>' | awk -F'> | <' '{print $1,$3}'
То, что я сделал, определяло >
и <
как разделители и печать определенных полей между разделителями.
Bash имеет также свои собственные регулярные выражения. Однако они не так мощны как в sed. Следующий код делает волшебство, не называя внешние программы:
var="<string> 1.11 </string>"
first=${var#<*>}
second=${first%<*>}
#echo $first
echo $second
Я пытался сделать это за один шаг также, но не успешно выполнялся, потому что регулярные выражения удара не поддерживают нежадные регулярные выражения. Я попробовал что-то вроде этого:
${var//<*>}
Код удаляет все сначала <
к последнему >
. :(
Я уверен, что это может быть сделано за один шаг с
${string/substring/replacement}
${string//substring/replacement}
но у меня нет времени для экспериментирования прямо сейчас. Для получения дополнительной информации смотрите здесь: http://www.tldp.org/LDP/abs/html/string-manipulation.html