Верните регулярное выражение в 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
}
Ответы
Ответ 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[@]}