首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sed不会替换文件中出现的所有字符串

Sed不会替换文件中出现的所有字符串
EN

Stack Overflow用户
提问于 2014-11-17 06:45:40
回答 1查看 320关注 0票数 0

编辑:我正在使用Cygwin。我不确定这是否相关,这是我在写这个问题时遗漏的一个细节。

EDIT2:我尝试用RegEx \s替换人们指出的"TAB“字符,它覆盖了空格字符(主要是空格和制表符),这根本不会影响表达式,这意味着它不是导致问题的制表符,特别是因为表达式运行一次也没有错误。

到目前为止,这个脚本已经给我带来了很多麻烦。

我之前确实有一个问题,但我解决了,虽然我在这里写了一个问题(幸运的imo),但这个问题我已经坚持了至少一个小时,我尝试了不同的解决方案,没有一个实际有效,或者告诉我一些我没有尝试过的东西。

我有一个相当酷的FTP日志抓取器脚本,这个脚本的一部分取代了这个日志文件中600MB的错误,基本上消除了它们。不幸的是,这个脚本也去掉了其他错误的一部分,所以我不得不编辑它。这就是我被卡住的地方。

通过基础研究,我发现sed可以做我想做的事情,到目前为止,通过三个小时的游戏,它做了我告诉它的大部分事情,除了一件事。尽管末尾附加了g修饰符,但我构建的sed语句中只有一个只替换了我给出的字符串的第一个实例。

我现在正在使用一个测试脚本,以避免对我的原始FTP脚本造成潜在的永久性损坏,并且该测试脚本复制了一个示例文件,其中包含一些我需要替换的错误。

演练脚本的预期行为之前显示: 1.设置一个前缀,它发生在文件中的所有行,脚本中非常重要的部分。2.将示例文件复制到名为test2.log的文件中。3.将UNIX换行符的所有实例\n替换为loll。4.删除战斗错误类型1和2的所有实例。5.为换行符\n返回所有带有UNIX的loll字符串,从而将日志文件恢复到减去错误的原始状态。

脚本:

代码语言:javascript
复制
#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

输出:预期:

代码语言:javascript
复制
meow
Test message
WOOF MEOWLOL

实际:http://pastebin.com/pnvDwkxz

它已经折磨了我一段时间了,因为我甚至在其他问题之前就有了这个问题,只是我几乎没有注意到它。我在脚本中找不到任何可预测的行为,就我所知,它应该工作得很好,并给出我期望的输出。

任何帮助都将不胜感激,因为一旦我能解决这个bug,我就能够进入脚本的其余部分,并在我的日志抓取器中用现有的战斗错误替换脚本来替换它。

我知道它很小很愚蠢,但我已经尝试了我遇到的所有东西,包括将:a;N;$!ba;添加到不能正常工作的bit的开头(并意识到它失败得很可怕)。

谢谢。~BAI1

EN

回答 1

Stack Overflow用户

发布于 2014-11-17 08:28:06

你是在找这样的东西吗:

代码语言:javascript
复制
sed -n ':a;s/\[.*Server thread\/\(INFO\|WARN\).*//i;/^$/!p;n;b a' battle.log 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26962958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档