我只想在BASH脚本中匹配一些文本,我试过使用sed,但是我似乎无法使它输出匹配而不是用某种东西replace它。
echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g'
这将输出:TestTdontReplaceString
这不是我想要的,我希望它输出:100
理想情况下,我希望它把所有的匹配在一个数组中。
编辑:文本input作为string进入:
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中使用双方括号[[ ]]
test运算符来完成这个操作,它将结果存储在一个名为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 }
那么,用s /“pattern1”/“pattern2”/ g的sed只是将全部pattern1s全部替换为pattern2。
除此之外,sed默认打印整行。 我建议把指令传给一个剪切命令,并试图提取你想要的数字:
如果你只是使用sed然后使用TRE:
sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.
我努力尝试并执行上述命令,只要确保语法是正确的。 希望这有助于。
只使用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[@]}