Подтвердить что ты не робот

Верните регулярное выражение в BASH script вместо его замены

Я просто хочу сопоставить некоторый текст в BASH script, iv попытался использовать sed, но я не могу заставить его просто выводить совпадение вместо того, чтобы заменять его чем-то.

echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g'

Будет выводиться: TestTdontReplaceString

Что я не хочу, я хочу, чтобы он выводил: 100

В идеале я хотел бы, чтобы он помещал все совпадения в массив.

изменить: Текст вводится как строка:

newName()
{
 #Get input from function
 newNameTXT="$1"

 if [[ $newNameTXT ]]; then
 #Use code that im working on now, using the $newNameTXT string.

 fi
} 
4b9b3361

Ответ 1

echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/'

echo "TestT100String" | grep -o  '[0-9]\+'

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

index=0
while read -r line
do
    array[index++]=$(echo "$line" | grep -o  '[0-9]\+')
done < filename

Здесь другой способ:

array=($(grep -o '[0-9]\+' filename))

Ответ 2

Вы можете сделать это чисто в bash с помощью оператора двойной квадратной скобки [[ ]], который хранит результаты в массиве с именем BASH_REMATCH:

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"

Ответ 3

Pure Bash. Используйте замену параметров (без внешних процессов и труб):

string="TestT100String"

echo ${string//[^[:digit:]]/}

Удаляет все не цифры.

Ответ 4

Используйте grep. Сед - редактор. Если вы хотите только совместить регулярное выражение, grep более чем достаточно.

Ответ 5

с помощью awk

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100

Ответ 6

Я не знаю, почему никто никогда не использовал expr: он переносимый и простой.

newName()
{
 #Get input from function
 newNameTXT="$1"

 if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
  echo "contains $num"
 fi
}

Ответ 7

Ну, Sed с s/ "pattern1" / "pattern2" /g просто заменяет глобально все шаблоны1 на шаблон 2.

Кроме того, sed по умолчанию печатает всю строку по умолчанию. Я предлагаю передать команду команде cut и попытаться извлечь номера u want:

Если вы смотрите только для использования sed, используйте TRE:

sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.

Я пытаюсь выполнить эту команду, поэтому просто убедитесь, что синтаксис прав. Надеюсь, это помогло.

Ответ 8

Я знаю, что это старая тема, но я натолкнулся на те же поиски и нашел еще одну прекрасную возможность применить регулярные выражения к строке/переменной, используя grep:

# Simple
$(echo "TestT100String" | grep -Po "[0-9]{3}")
# More complex using lookaround
$(echo "TestT100String" | grep -Po "(?i)TestT\K[0-9]{3}(?=String)")

С помощью возможностей поиска можно расширить поисковые выражения для лучшего соответствия. Где (?i) указывает шаблон перед найденным шаблоном (lookahead), \K указывает фактический шаблон поиска, а (?=) Содержит шаблон после поиска (lookbehind).

https://www.regular-expressions.info/lookaround.html

Данный пример совпадает со TestT([0-9]{3})String регулярного выражения PCRE TestT([0-9]{3})String

Ответ 9

используя только bash shell

declare -a array
i=0
while read -r line
do
        case "$line" in
            *TestT*String* )
            while true
            do
                line=${line#*TestT}
                array[$i]=${line%%String*}
                line=${line#*String*}
                i=$((i+1))
                case "$line" in
                    *TestT*String* ) continue;;
                    *) break;;
                esac
            done
            esac
done <"file"
echo ${array[@]}