неожиданный результат с использованием регулярных выражений в Bash - PullRequest
0 голосов
/ 29 марта 2019

Я попытался создать выражение регулярного выражения, которое будет проверять число в диапазоне от -100 до 100. Я сделал выражение регулярного выражения ^ [- +]? ([0-9] [0-9]? | 100) $.Я ищу шаблон в строке, а не просто целое число.

это мой сценарий:

#!/bin/bash

a="input2.txt"

while read -r line; do
mapfile -t d <<< "$line"

for i in "${d[@]}"; do
  if [[ "$i" =~ ^[-+]?([0-9][0-9]?|100)$ ]]; then
  echo "$i"
  fi
 done
done < "$a"

это мой входной файл:

add $s1 $s2 $s3
sub $t0 
sub $t1 $t0 
addi $t1 $t0 75
lw $s1 -23($s2)

фактический результат - ничто.

ожидаемый результат:

75  -23($s2)

Ответы [ 2 ]

0 голосов
/ 29 марта 2019
#first store your file in an array so that we could pass thru the words
word_array=( $(<filename) )
for i in "${word_array[@]}"
do 
if [[ $i =~ ^([[:blank:]]{0,1}-?[0-9]+)([^[:digit:]]?[^[:blank:]]*)$ ]]
#above line looks for the pattern while separating the number and an optional string 
#that may follow like ($s2) using '()' so that we could access each part using BASH_REMATCH later.
then 
#now we have only the number which could be checked to fall within a range
[ ${BASH_REMATCH[1]} -ge -100 ] && [ ${BASH_REMATCH[1]} -le 100 ] && echo "$i"
fi
done

Пример вывода

75
-23($s2)

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

0 голосов
/ 29 марта 2019

[...] обозначает набор символов, где тире можно использовать для указания диапазона символов. Например, [4-6u-z] в регулярном выражении означает один из символов 4,5,6, u, v, w, x, z. Ваше выражение [1-200] просто соответствует символам (цифрам) 0, 1 и 2.

В таком случае я бы сделал два шага: сначала извлеки из вашей строки начальные числовые части, а затем использую арифметическое сравнение результатов. Например (не проверено!):

if [[ $i =~ ^-?[0-9]+ ]]
then
  intval=${BASH_REMATCH[0]}
  if (( intval >= -200 && intval <= 1000 ))
  then
    ....

См. Справочную страницу bash для объяснения массива BASH_REMATCH .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...