在BASH脚本中返回正则表达式匹配,而不是替换它

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)

  • 需要一只真正的猴子来解决这个问题 (3认同)

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)

删除所有非数字.

  • 这确实应该有更多的支持。 (2认同)

小智 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


Mic*_*Mic 5

使用grep.Sed是一名编辑.如果你只想匹配正则表达式,那么grep就足够了.