2012-03-26 16 views
10

ファイル内の各行をループし、${で始まり、}で終わる文字を見つけて抽出しようとしています。最終的な出力としては、SOLDIRTEMPinputfile.sh)だけが必要です。sed/regexを使用して同じ行に複数のオカレンスを抽出します

私は次のスクリプトを使用しようとしましたが、パターンTEMPの2つ目の一致と一致して抽出されたようです。私も最後にgを追加しようとしましたが、それは役に立ちません。誰も私に、同じ行の両方の/複数のオカレンスにマッチして抽出する方法を教えてもらえますか?

inputfile.sh:

. 
. 
SOLPORT=\`grep -A 4 '\[LocalDB\]' \${SOLDIR}/solidhac.ini | grep \${TEMP} | awk '{print $2}'\` 
. 
. 

script.sh:

infile='inputfile.sh' 
while read line ; do  
    echo $line | sed 's%.*${\([^}]*\)}.*%\1%g' 
done < "$infile" 

答えて

9

grepソリューション?

grep -oP '(?<=\${).*?(?=})' 

それはPerlスタイルlookaround assertionsを使用し、レイジー'${''}'の間には何も一致します。そこにあなたの供給ラインを

は、私が

$ echo "SOLPORT=\`grep -A 4 '[LocalDB]' \${SOLDIR}/solidhac.ini | grep \${TEMP} | awk '{print $2}'\`" | grep -oP '(?<=\${).*?(?=})' 
SOLDIR 
TEMP 
+1

TILについて 'grep -P'、ありがとう。 –

+0

非常に便利です。ありがとう! – noumenon

2

これが(多分、あなたの特定の入力ライン用)あなたのために働くかもしれない:

sed 's/[^$]*\(${[^}]\+}\)[^$]*/\1\t/g;s/$[^{$]\+//g' 
+0

それは働いた。ありがとう。 – user1292603

+0

この場合、その回答を受け入れることができます。 –

0

はsedを使用して、単一のラインから複数の一致を抽出取得することは、私はそれが可能だろうと思ってほど悪くはありませんが、それは読むためにまだかなり難解と難しいです:

$ echo 'Hello ${var1}, how is your ${var2}' | sed -En ' 
    # Replace ${PREFIX}${TARGET}${SUFFIX} with ${PREFIX}\a${TARGET}\n${SUFFIX} 
    s#\$\{([^}]+)\}#\a\1\n# 
    # Continue to next line if no matches. 
    /\n/!b 
    # Remove the prefix. 
    s#.*\a## 
    # Print up to the first newline. 
    P 
    # Delete up to the first newline and reprocess what's left of the line. 
    D 
' 
var1 
var2 

そして、1行上のすべて:POSIXの正規表現を拡張しているので

sed -En 's#\$\{([^}]+)\}#\a\1\n#;/\n/!b;s#.*\a##;P;D' 

貪欲でない量指定子をサポートしていないか、かっこ式に改行を置いています。改行の代わりに接頭辞の末尾にBEL文字(\a)を使用しました。改行を使用することもできますが、2回目の置換は疑問のあるs#.*\n(.*\n.*)##でなければなりません。これには、正規表現エンジンによる病的なバックトラッキングが必要な場合があります。

関連する問題