Возвратите соответствие regex в сценарии Bash, вместо того, чтобы заменить его

Я просто хочу соответствовать некоторому тексту в сценарии Bash, i’v пытался использовать 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
} 
22
задан Mint 14 December 2009 в 02:26
поделиться

8 ответов

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))
31
ответ дан 29 November 2019 в 03:22
поделиться

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

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
35
ответ дан 29 November 2019 в 03:22
поделиться

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

string="TestT100String"

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

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

23
ответ дан 29 November 2019 в 03:22
поделиться

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

5
ответ дан 29 November 2019 в 03:22
поделиться

с использованием awk

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
1
ответ дан 29 November 2019 в 03:22
поделиться

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

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

Если вы хотите использовать только sed, тогда используйте TRE:

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

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

0
ответ дан 29 November 2019 в 03:22
поделиться

с использованием только оболочки bash

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[@]}
-2
ответ дан 29 November 2019 в 03:22
поделиться

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

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

 if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
  echo "contains $num"
 fi
}
1
ответ дан 29 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

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