Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Sed isn';t替换文件中所有出现的字符串_Regex_Bash_Sed_Cygwin - Fatal编程技术网

Regex Sed isn';t替换文件中所有出现的字符串

Regex Sed isn';t替换文件中所有出现的字符串,regex,bash,sed,cygwin,Regex,Bash,Sed,Cygwin,编辑:我正在使用Cygwin。我不确定这是否相关,这是我在写这个问题时遗漏的一个细节 EDIT2:已尝试将人们指出的“TAB”字符替换为包含空格字符(主要是空格和制表符)的正则表达式,这根本不会影响表达式,这意味着不是制表符导致问题,特别是因为表达式运行一次都没有错误 到目前为止,这个脚本给我带来了很多麻烦 我以前确实有过一个问题,但我解决了,当我在这里写一个问题时(幸运的是imo),但这个问题我已经坚持了至少一个小时,我尝试了各种各样的解决方案,没有一个真正有效,或者告诉我一些我还没有尝试过的

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

EDIT2:已尝试将人们指出的“TAB”字符替换为包含空格字符(主要是空格和制表符)的正则表达式,这根本不会影响表达式,这意味着不是制表符导致问题,特别是因为表达式运行一次都没有错误

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

我以前确实有过一个问题,但我解决了,当我在这里写一个问题时(幸运的是imo),但这个问题我已经坚持了至少一个小时,我尝试了各种各样的解决方案,没有一个真正有效,或者告诉我一些我还没有尝试过的东西

我有一个看起来很酷的FTP日志获取程序脚本,该脚本的一部分将此日志文件中的600MB错误替换为零,基本上删除了它们。不幸的是,这个脚本也消除了部分其他错误,所以我不得不编辑它。这就是我被卡住的地方

通过基础研究,我终于发现
sed
可以做我想做的事情,并且通过三个小时的游戏,它完成了我告诉它的大部分事情,只做了一件事。我构建的
sed
语句中有一个(而且只有一个)只替换了我给定的字符串的第一个实例,尽管末尾附加了
g
修饰符

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

在显示以下内容之前,先演练脚本的预期行为: 1.设置发生在文件中所有行上的前缀,这是脚本中非常重要的部分。 2.将示例文件复制到名为test2.log的文件中 3.将UNIX换行符的所有实例\n替换为[loll](我想到的第一件事) 4.删除战斗错误类型1和2的所有实例。 5.使用UNIX返回换行符的所有[loll]字符串,\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
我已经将它们设置为也对提供的字符串运行不区分大小写的检查,因为有时我使用所有小写字母编写,但是在大多数情况下,我直接复制并粘贴了它

样本输入:

产出: 预期:

meow
Test message
WOOF MEOWLOL
实际:

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

任何帮助都将不胜感激,因为只要我能解决这个bug,我就可以输入脚本的其余部分,并用我的日志获取程序中现有的battle error replacement脚本替换它

了解我是件小事,但我已经尝试了我遇到的一切,包括添加
:a;N、 美元!ba到无法正常工作的位的开头(并且意识到失败得很厉害)

谢谢。
~BAI1

你在找这样的东西吗:

sed -n ':a;s/\[.*Server thread\/\(INFO\|WARN\).*//i;/^$/!p;n;b a' battle.log 

看起来在
之前有多个空格,或者可能有一个选项卡。尝试在那里使用
\s+
。简而言之,您希望删除
[00:00:00][Server thread/INFO]:在战斗中捕获的错误。继续…
以及之后的所有错误行,不是吗?@Barmar,在我发布到这里之前,我重写了整个脚本以确保它不是语法错误,包括“at”之前的制表符/空格的可能性。我仔细检查了日志,它实际上是“at”之前的一个选项卡,在第一次删除错误时使用选项卡不会导致问题。@casimirithippolyte,正是这样。有三种不同类型的作战失误,但其中较大的是主要失误。第三个我可以稍后做,一旦我们发现了为什么这不能像预期的那样工作。另外,两人和其他人都注意到第二个表达式工作得很好,除非被打断,然后错过一个步骤并像往常一样继续。示例输出:以及我输入的内容:解释当捕获[Server thread/INFO]和[Server thread/WARN]的语法已经完全按照预期工作时,这是如何相关的。我的问题是,在中断后,它不会尝试替换文件中特定错误的进一步实例(键入一个,较大的Sed表达式),例如:一个错误结束和另一个错误开始之间的文本。@BAI1:此Sed命令替换所有脚本。如果它不是您想要的,请尝试给出一个更具代表性的示例文件。我不想替换文件中的所有[Server thread/INFO]或[Server thread/WARN]语句。很抱歉,如果我说的话可能会被认为是不尊重,尽管我想要的是一个脚本来删除我的示例输入文件中的所有错误,而不是其他任何错误。要编辑我的上述注释之一,我不想在出现上述两个字符串后删除所有行。抱歉搞混了。@BAI1:不客气。主要的问题是你没有解释为什么一行或一个子串应该或不应该被删除,标准是什么?您的原始脚本显然太复杂,不是解决方案。一个包含15行文字的sed命令,太疯狂了。所以,如果你解释一下你是如何知道一行必须被删除或不被删除的,它将有可能帮助你。否则,您将发现很少有人对在长脚本中调试错误的方法感兴趣,这种方法会处理大量数据。