BASHスクリプトで正規表現マッチを返すのではなく、それを置き換えます
質問
私はbashスクリプトでテキストを一致させたい、i'vは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_REMATCH
テスト演算子を使用して、bashで、純粋にこの操作を行うことができます:
[[ "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 / "パターン1" / "パターン2" /グラムとSEDがちょうどパターン2にグローバルにすべてpattern1sを置き換えます。
デフォルトでは、デフォルトでは行全体を印刷しながら、それに加えて、sedの。 私はカットコマンドに命令をパイプとuがしたい番号を抽出しようと提案します:
uはsedを使用するだけのlookinされている場合は、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[@]}