Min*_*int 22 regex linux bash sed sh
我只是想在BASH脚本中匹配一些文本,我尝试使用sed,但我似乎无法让它只输出匹配而不是替换它.
echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g'
Run Code Online (Sandbox Code Playgroud)
将输出:TestTdontReplaceString
这不是我想要的,我希望它输出:100
理想情况下,我希望它将所有匹配放在一个数组中.
编辑:文本输入以字符串形式出现:
newName()
{
#Get input from function
newNameTXT="$1"
if [[ $newNameTXT ]]; then
#Use code that im working on now, using the $newNameTXT string.
fi
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*ica 35
您可以使用双方括号[[ ]]测试运算符纯粹在bash中执行此操作,该运算符将结果存储在一个名为的数组中BASH_REMATCH:
[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
Run Code Online (Sandbox Code Playgroud)
Pau*_*ce. 31
echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/'
echo "TestT100String" | grep -o '[0-9]\+'
Run Code Online (Sandbox Code Playgroud)
用于将结果放入数组的方法在某种程度上取决于如何检索实际数据.您的问题中没有足够的信息可以指导您.但是,这是一种方法:
index=0
while read -r line
do
array[index++]=$(echo "$line" | grep -o '[0-9]\+')
done < filename
Run Code Online (Sandbox Code Playgroud)
这是另一种方式:
array=($(grep -o '[0-9]\+' filename))
Run Code Online (Sandbox Code Playgroud)
Fri*_*ner 23
纯粹的狂欢.使用参数替换(无外部进程和管道):
string="TestT100String"
echo ${string//[^[:digit:]]/}
Run Code Online (Sandbox Code Playgroud)
删除所有非数字.
小智 6
我知道这是一个古老的话题,但我通过相同的搜索找到了她,并发现了另一种很好的可能性,即使用 grep 在字符串/变量上应用正则表达式:
# Simple
$(echo "TestT100String" | grep -Po "[0-9]{3}")
# More complex using lookaround
$(echo "TestT100String" | grep -Po "(?i)TestT\K[0-9]{3}(?=String)")
Run Code Online (Sandbox Code Playgroud)
使用环视功能可以扩展搜索表达式以获得更好的匹配。其中(?i)表示搜索模式之前的模式(lookahead),
\K表示实际搜索模式并(?=)包含搜索后的模式(lookbehind)。
https://www.regular-expressions.info/lookaround.html
给定的示例与 PCRE 正则表达式匹配 TestT([0-9]{3})String
| 归档时间: |
|
| 查看次数: |
67064 次 |
| 最近记录: |