ファイル内の文字列を一致させる方法

ファイル内の文字列を一致させる方法

このコードをPythonからBashにコピーしようとしています。

import re
w = open("filetest.txt")
for item in re.findall(r'STRING:\s*(.+)"', w.read()):
  print item

Bashではこれが正しいかどうかわかりません。これは何も返しません。

while read line; do
    if [[ $line =~ r'STRING:\s*(.+)"' ]]; then
        echo $line
    fi
done < filetest.txt

ファイルテストiso.3.6.1.4.1.25355.3.2.6.3.2.1.11.1.1.1 = STRING: "785c7208dcf0"

出力:785c7208dcf0

答え1

sed -n 's/.*STRING:[[:blank:]]*\(..*\)/\1/p' filetest.txt

シェルループではこれを行いません。これらのループは通常、テキストの解析には適していないためです(」シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?")。

代わりに、上記の単一のコマンドはsed正規表現と一致するために使用されます(ここでは次のように書き直されます)。基本正規表現そしてPCREとして、Perl互換正規表現)。使用された編集コマンドは、sed一致する行をキャプチャされたテキストに置き換えて出力します。

他の方法:

awk -F ':[[:blank:]]*' '/STRING/ { print $2 }' filetest.txt

これはファイルの各行をレコードとして扱い、フィールドは:スペースやタブの数に関係なく区切ります。STRINGパターンが行で見つかると、2番目の対応するフィールドが印刷されます。

それでもループを使用しますかbash

while IFS= read -r line; do
    if [[ $line =~ 'STRING:'[[:blank:]]*(.+) ]]; then
        printf '%s\n' "${BASH_REMATCH[1]}"
    fi
done <filetest.txt

このBASH_REMATCH配列には、一致からキャプチャされた個々のビットが含まれます。正規表現自体は(次のようにする必要があります。拡張正規表現)文字通り解釈する必要があるビットを除いて引用しないでください。注:正規表現を引用してもBASH_REMATCHキャプチャされたデータが見つからない場合はここにあります。また、正規表現を使ってみました。正確にPythonで式を作成するのと同じです。bashPythonではありません。

または、

while IFS= read -r line; do
    match=$(expr "$line" : '.*STRING:[[:blank:]]*\(..*\)')
    if [ -n "$match" ]; then
        printf '%s\n' "$match"
    fi
done <filetest.txt

あなたの質問にあなたの入力が与えられると、上記のさまざまなバリエーションが出力されます。

"785c7208dcf0"

また見なさい:

関連情報