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]\+'
結果を配列に格納するために使用する方法は、実際のデータがどのように取得されるかによって多少異なります。質問に十分な情報がありません。ただし、ここに1つの方法があります。
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]}"
純粋Bash。パラメータ置換を使用します(外部プロセスとパイプはありません):
string="TestT100String"
echo ${string//[^[:digit:]]/}
数字以外をすべて削除します。
Grepを使用します。 Sedはエディタです。正規表現とのみ一致させたい場合は、grepで十分です。
これは古いトピックであることはわかっていますが、同じ検索に沿って彼女に来て、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
と同じに一致します
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
}
Sed with s/"pattern1"/"pattern2"/gは、すべてのpattern1をグローバルにパターン2に置き換えるだけです。
その上、デフォルトでsed whileデフォルトで行全体を印刷します。命令をカットコマンドにパイプして、必要な数を抽出することをお勧めします。
Uがsedのみを使用するように調べている場合は、TREを使用します。
sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.
上記のコマンドを試して実行するので、構文が正しいことを確認します。これがお役に立てば幸いです。