BASHスクリプトで正規表現マッチを返すのではなく、それを置き換えます

StackOverflow https://stackoverflow.com/questions/1898553

  •  19-09-2019
  •  | 
  •  

質問

私は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[@]}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top