2017-10-21 110 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”没有扩展