Я просто хочу соответствовать некоторому тексту в сценарии 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
}
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))
Вы можете сделать это исключительно в bash, используя оператор теста с двойной квадратной скобкой [[]]
, который сохраняет результаты в массиве с именем BASH_REMATCH
:
[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
Чистый Bash . Используйте подстановку параметров (без внешних процессов и каналов):
string="TestT100String"
echo ${string//[^[:digit:]]/}
Удаляет все нецифровые символы.
Используйте команду grep. Сед - редактор. Если вы хотите сопоставить только регулярное выражение, grep более чем достаточно.
с использованием awk
linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
Что ж, Sed с s / "pattern1" / "pattern2" / g просто заменяет глобально все pattern1 на шаблон 2.
Кроме того, sed по умолчанию печатает все строка по умолчанию. Я предлагаю связать инструкцию с командой cut и попытаться извлечь нужные числа:
Если вы хотите использовать только sed, тогда используйте TRE:
sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.
Я не пытаюсь выполнить указанную выше команду, поэтому просто убедитесь, что синтаксис верно. Надеюсь, это помогло.
с использованием только оболочки 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[@]}
Я не знаю, почему никто никогда не использует expr
: это портативно и просто.
newName()
{
#Get input from function
newNameTXT="$1"
if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
echo "contains $num"
fi
}