返回一个正则表达式匹配的bash脚本,而不是替换它
题
我只是想匹配bash脚本一些文字,我心中已经尝试使用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]}"
纯的击即可。使用参数替换(无外部过程和管道):
string="TestT100String"
echo ${string//[^[:digit:]]/}
移除所有非数字。
使用的grep。 SED是一个编辑器。如果你只想匹配一个正则表达式,grep的是绰绰有余了。
用awk
linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
我不知道为什么从来没有人使用expr
:它的便携易
newName()
{
#Get input from function
newNameTXT="$1"
if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
echo "contains $num"
fi
}
我知道这是一个老话题,但我来到她沿着同样的搜索,发现了另一个可能性很大用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)
表示搜索模式(前瞻)之前的模式,
\K
指示实际搜索模式和(?=)
包含搜索(回顾后)后的图案。
https://www.regular-expressions.info/lookaround.html
在给定的例子匹配相同的正则表达式PCRE TestT([0-9]{3})String
那么,桑达带有S /“样式” /“式样2” /克只是替换全局所有pattern1s到图案2。
除此之外,在由缺省默认打印整个线的sed。 我建议管道将指令发送到剪切命令,并试图提取ü想的数字:
如果u的看着只用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[@]}