EDIT2:尝试更换" TAB" char人们指出RegEx \ s,它涵盖间距字符(主要是空格和制表符),这根本不影响表达式,这意味着它不是导致问题的制表符,特别是因为表达式无论如何都会运行一次而没有错误。
到目前为止,这个脚本给我带来了很多麻烦。
我之前有一个问题,但是我在这里写了一个问题(幸运的imo),我解决了这个问题,但是这个问题我已经坚持了至少一个小时了,我已经尝试了不同的解决方案,这些都没有实际工作或告诉我一些我还没有尝试过的东西。
我有一个相当酷的看似FTP日志获取器脚本,该脚本的一部分将此日志文件中的600MB错误替换为空,基本上将其删除。不幸的是,这个脚本也摆脱了其他部分错误,所以我不得不编辑它。这就是我被卡住的地方。
通过基础研究,我设法发现sed
可以做我想要的事情,到目前为止,通过三个小时的比赛它完成了我告诉它的大部分内容,减去一件事。我构建的sed
语句中的一个,只有一个,只替换了我给它的字符串的第一个实例,尽管最后附加了g
修饰符。
我正在使用测试脚本,以避免对原始FTP脚本造成潜在的永久性损坏,并且测试脚本会复制一个示例文件,其中包含一些我需要替换的错误。
在显示之前演练脚本INTENDED行为: 1.设置在文件中所有行上发生的前缀,这是脚本中非常重要的部分。 2.将示例文件复制到名为test2.log的文件中 3.用[loll]替换UNIX换行符char \ n的所有实例(我想到的第一件事) 4.删除战斗错误类型1和2的所有实例。 5.返回所有[loll]字符串与UNIX \ n的换行符,因此将日志文件返回到原始状态减去错误。
脚本:
#DTP="\[([0-9]+-[0-9]+-[0-9]+-[0-9]+|latest)\.log\] \[[0-9]+:[0-9]+:[0-9]+\] \[Server thread/(INFO|WARN)\]: "
echo "${DTP}"
DTP1="\[[0-9]*:[0-9]*:[0-9]*\]\s\[Server\sThread\/\(WARN\|INFO\)\]:\s"
DTP="\[loll\]\[[0-9]*:[0-9]*:[0-9]*\]\s\[Server\sThread\/\(WARN\|INFO\)\]:\s"
echo "${DTP}"
echo "1"
cp test.log test2.log
#cat test.log >test2.log
sed -i ':a;N;$!ba;s/\n/\[loll\]/g' test2.log #| egrep -i "" >test2.log
sed -i 's/'${DTP1}'Caught error in battle. Continuing...'${DTP}'java.lang.NullPointerException'${DTP}' at com.pixelmonmod.pixelmon.battles.controller.participants.PixelmonWrapper.useAttack(PixelmonWrapper.java:173)'${DTP}' at com.pixelmonmod.pixelmon.battles.controller.participants.PixelmonWrapper.takeTurn(PixelmonWrapper.java:330)'${DTP}' at com.pixelmonmod.pixelmon.battles.controller.BattleControllerBase.takeTurn(BattleControllerBase.java:276)'${DTP}' at com.pixelmonmod.pixelmon.battles.controller.BattleControllerBase.update(BattleControllerBase.java:157)'${DTP}' at com.pixelmonmod.pixelmon.battles.BattleRegistry.updateBattles(BattleRegistry.java:63)'${DTP}' at com.pixelmonmod.pixelmon.battles.BattleTickHandler.tickStart(BattleTickHandler.java:12)'${DTP}' at cpw.mods.fml.common.eventhandler.ASMEventHandler_20_BattleTickHandler_tickStart_WorldTickEvent.invoke(.dynamic)'${DTP}' at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:51)'${DTP}' at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:122)'${DTP}' at cpw.mods.fml.common.FMLCommonHandler.onPostWorldTick(FMLCommonHandler.java:255)'${DTP}' at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:929)'${DTP}' at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:429)'${DTP}' at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:776)'${DTP}' at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:639)'${DTP}' at java.lang.Thread.run(Thread.java:745)//gI' test2.log
echo "2"
sed -i 's/'${DTP1}'Caught error in battle. Continuing...'${DTP}'java.lang.NullPointerException\[loll\]//gI' test2.log
echo "3"
sed -i 's/\[loll\]/\n/g' test2.log
我已将它们设置为对所提供的字符串运行不区分大小写的检查,因为有时我会使用小写字母进行写操作,但是对于大多数情况,我直接复制并粘贴它。
示例输入: http://pastebin.com/3KPB33X2
输出: 预期:
meow
Test message
WOOF MEOWLOL
实际:http://pastebin.com/pnvDwkxz
现在已经把我的思绪杀了一段时间,因为我甚至在另一个问题之前就遇到了这个问题,除了我几乎没有注意到它。我无法在脚本中找到任何可预测的行为,据我所知,它应该完全正常工作并给我预期的输出。
任何帮助都会受到赞赏,因为只要我能解决这个问题,我就可以输入脚本的其余部分并将其替换为我日志中现有的战斗错误替换脚本 - 提取器。
了解我这是一个小而愚蠢的事情,但我已经尝试过我所遇到的所有事情,包括将:a;N;$!ba;
添加到不能正常工作的位的开头(并意识到失败的可怕性。)
感谢。 〜BAI1
答案 0 :(得分:0)
你在寻找这样的东西:
sed -n ':a;s/\[.*Server thread\/\(INFO\|WARN\).*//i;/^$/!p;n;b a' battle.log