2017-10-21 15 views
0

変数のエスケープ文字のためにsedが早く終了しました。私が必要としていることをawkが望むことはできますが、見えません。変数のエスケープ文字でSedが失敗する

# Main section ==========================================╕ 
LASTIP=`grep -E '[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}\.[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}\.[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}\.[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}' $SRCDIR/$IPLOGFILE | tail -1|awk -F'\t' '{print$3}'` 
if [ "$CURRENTIP" == "$LASTIP" ]; then 
# Still using old IP===================================╕ 
    FIRSTDETECTED=`grep $LASTIP $SRCDIR/$IPLOGFILE | tail -1|awk -F'\t' '{print$1}'` 
    LASTDETECTED=`grep $LASTIP $SRCDIR/$IPLOGFILE | tail -1|awk -F'\t' '{print$2}'` 
    OLDLINE=$(printf "$FORMAT" "$FIRSTDETECTED" "$LASTDETECTED" "$LASTIP") 
    AMENDEDLINE=$(printf "$FORMAT" "$FIRSTDETECTED" "$TIMESTAMP" "$LASTIP") 
    sed -i "s/'$OLDLINE'/'$AMENDEDLINE'/g" $SRCDIR/$IPLOGFILE 

これは$OLDLINEおよび/または$AMENDEDLINEは文字をエスケープ含まれているため、終了する、離れて最後のsedから正常に動作します。私は問題を解決するためにawkを直接置き換えることができると思ったが、私はそれについてもっと考えていたほど、awkを使ってセクション全体をもっと効率的に行うことができると思った。問題はどこから始めるべきかわからないことです。私はそれを簡素化することについて自分自身をだますのですか、それとも方法がありますか? P

私はセクションを切り取らましたが、供給することができます;がある場合、あなたは

は*カートマンの礼儀私はこのようなものを見つけるよう*「私の壊れやすい小さな心をワープ」、私を助けする必要がありますそれが役立つならスクリプトの残り?

+0

を展開されません、私は次の2行の代わりに、最後に試したと思う

sed -i 's/'"$OLDLINE"'/'"$AMENDEDLINE"'/g' "$SRCDIR"/"$IPLOGFILE" 

のように試すことができますSED '-i "S/'$ OLDLINE'/'$のAMENDEDLINE'/G" $ SRCDIR/$ IPLOGFILE' ' sedの-i "$ dの" $ SRCDIR/$ IPLOGFILE' 'printfの「$ #sed 「$ FIRSTDETECTED」「$ TIMESTAMP」「$ LASTIP」>> $ SRCDIR/$ IPLOGFILE' – Greg

+0

」セクションを抜粋して提供することができます残りの ".. [最小、完全、検証可能な例]を読んでください(http://stackoverflow.com/help/mcve)「戦争と平和」全文ではなく、問題を引き起こす最小限のコードを見たい;-)。あなたの問題を基本に取り除くときに、しばしば解決策を見つけるでしょう。がんばろう。 – shellter

+0

私はあなたの意見を一般的に取り上げますが、LASTIP、IF条件、FIRSTDETECTED&LASTDETECTEDを提供するgreps、そして最終的にファイルの最新のタイムスタンプを更新するsedを提供するgrepの代わりに単一のawkが必要かどうかを尋ねています。私は文脈を示さずに問題を「再現する」方法を見ることができません。 OK、私はデバッグしようとしていたエコー/ printfsをいくつか取り除くことができました。 – Greg

答えて

0

あなたは、おそらく私は「$ OLDLINE」と「$のAMENDEDLINE」は回避策として

関連する問題