web-dev-qa-db-ja.com

置換するのではなく、BASHスクリプトで正規表現の一致を返す

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
} 
22
Mint
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]}"
35
John Kugelman

純粋Bash。パラメータ置換を使用します(外部プロセスとパイプはありません):

string="TestT100String"

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

数字以外をすべて削除します。

24
Fritz G. Mehner

Grepを使用します。 Sedはエディタです。正規表現とのみ一致させたい場合は、grepで十分です。

5
Mic

これは古いトピックであることはわかっていますが、同じ検索に沿って彼女に来て、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と同じに一致します

2
ToastStudios

awkを使用する

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
1
ghostdog74

なぜ誰もexprを使用しない理由はわかりません。移植性があり簡単です。

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

 if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
  echo "contains $num"
 fi
}
1
ephemient

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'.

上記のコマンドを試して実行するので、構文が正しいことを確認します。これがお役に立てば幸いです。

0
tomkaith13