このコードを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で式を作成するのと同じです。bash
Pythonではありません。
または、
while IFS= read -r line; do
match=$(expr "$line" : '.*STRING:[[:blank:]]*\(..*\)')
if [ -n "$match" ]; then
printf '%s\n' "$match"
fi
done <filetest.txt
あなたの質問にあなたの入力が与えられると、上記のさまざまなバリエーションが出力されます。
"785c7208dcf0"
また見なさい: