2017-10-21 187 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 

這工作得很好除了最後SED,這將終止,因爲$OLDLINE和/或$AMENDEDLINE包含逃脫字符。我認爲我可以直接替換awk來解決問題,但我越想越想,整個部分可以用awk更有效地完成 - 也許在awk的一行中?麻煩是我不知道從哪裏開始。我是在簡化它還是有辦法嗎?如果有,你可能要幫我,因爲我覺得這個東西「扭曲我脆弱的小心靈」 *

*卡特曼的禮貌,P

我已經剪掉了部分,但可以提供如果有幫助,腳本的其餘部分?

+0

作爲一種變通方法,我試過下面兩行,而不是最後的SED '#sed -i 「S/'$ OLDLINE'/ '$ AMENDEDLINE'/ G」 $ SRCDIR/$ IPLOGFILE' 'sed的-i 「$ d」 $ SRCDIR/$ IPLOGFILE' 'printf的「$ FORMAT「」$ FIRSTDETECTED「」$ TIMESTAMP「」$ LASTIP「>> $ SRCDIR/$ IPLOGFILE' – Greg

+0

」刪除了部分,但可以提供其餘的「..請閱讀[最小,完整,可驗證示例](http://stackoverflow.com/help/mcve)我們希望看到產生問題的最小代碼,而不是整個」戰爭與和平「 ;-)。通常,當您將問題歸結爲基礎知識時,您可以自己找到解決方案。祝你好運。 – shellter

+0

我的觀點一般,但我問一個awk是否可以替代傳遞LASTIP的grep,IF條件,提供FIRSTDETECTED&LASTDETECTED的greps以及最後更新文件中最新時間戳的sed。如果不顯示上下文,我無法看到「重現」問題的方法。好的,所以我可以剝去我曾經嘗試調試的幾個回聲/打印文件。我將立即編輯這些文件;) – Greg

回答

0

你或許可以嘗試這樣的

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

我覺得「$ OLDLINE」和「$ AMENDEDLINE」沒有擴展