30

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
}
4

9 に答える 9

49

[[ ]]これは、結果を という配列に格納する二重角括弧テスト演算子を使用して、純粋に bash で行うことができますBASH_REMATCH

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
于 2009-12-14T01:59:10.600 に答える
39
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))
于 2009-12-14T02:00:45.013 に答える
29

Pure Bash. Use parameter substitution (no external processes and pipes):

string="TestT100String"

echo ${string//[^[:digit:]]/}

Removes all non-digits.

于 2009-12-16T17:33:25.677 に答える
8

私はこれが古いトピックであることを知っていますが、私は彼女と同じ検索を行い、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

于 2019-04-12T10:58:51.673 に答える
5

grep を使用します。セッドは編集者です。正規表現のみを照合する場合は、grep で十分です。

于 2009-12-14T01:56:22.277 に答える
1

awk の使用

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
于 2009-12-14T02:38:11.053 に答える
1

誰も使用しない理由がわかりませんexpr。移植可能で簡単です。

newName()
{
 #Get input from function
 newNameTXT="$1"

 if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
  echo "contains $num"
 fi
}
于 2009-12-14T17:30:05.077 に答える
0

まあ、s/"pattern1"/"pattern2"/g を持つ Sed は、すべてのパターン 1 をパターン 2 にグローバルに置き換えるだけです。

それに加えて、 sed while default by default で行全体を印刷します。命令をカットコマンドにパイプして、必要な数値を抽出することをお勧めします:

sed のみを使用する場合は、TRE を使用します。

sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.

上記のコマンドを実行しようとしないので、構文が正しいことを確認してください。これが役に立ったことを願っています。

于 2009-12-14T02:06:28.747 に答える
-1

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[@]}
于 2009-12-14T02:44:48.747 に答える