編輯:我正在使用Cygwin。我不確定這是否相關,這是我在寫這個問題時錯過的一個細節。sed並非替換文件中所有出現的字符串
編輯2:試圖用RegEx \ s指出的「TAB」字符的人,其中涵蓋間距字符(主要是空格和製表符),這並不影響表達式,這意味着它不是標籤引起的這個問題,特別是因爲該表達式無論如何運行一次沒有錯誤。
到目前爲止,這個腳本一直給我造成很大的麻煩。
我之前有一個問題,但我決定,雖然我在這裏寫一個問題(幸運的IMO),但這一個我一直堅持了至少一個小時,我嘗試了各種解決方案,沒有一個這實際上工作或告訴我一些我沒有嘗試過的東西。
我有一個相當酷的似乎FTP日誌fetcher腳本和該腳本的一部分替換這個日誌文件中的600MB的錯誤什麼都沒有,基本上將其刪除。不幸的是,這個腳本也擺脫了其他錯誤的部分,所以我不得不編輯它。這是我陷入困境的地方。
通過基礎研究,我設法找出sed
可以做我想做的,並經過三個小時到目前爲止打它確實最什麼,我告訴它,減一兩件事。我構建的sed
語句中的一個和僅一個僅取代了我給出的字符串的第一個實例,儘管在末尾附加了g
修飾符。
我現在正在使用一個測試腳本,以避免潛在的永久性損壞我的原始FTP腳本,並且測試腳本通過一個示例文件複製了一些我需要替換的錯誤。
腳本的演練在顯示之前的預期行爲: 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
它已經殺死我的腦海裏有一段時間了,因爲我甚至之前,其他有這個問題一個,除了我幾乎沒有注意到它。我無法在腳本中找到任何可預測的行爲,並且據我所知,它應該工作得很好,並給我預期的輸出。
任何幫助,將不勝感激,因爲只要我能得到這個bug整理出來,我將能夠進入腳本的其餘部分,並用我的日誌提取器中現有的戰鬥錯誤替換腳本。
瞭解我這是一個小而愚蠢的東西,但我已經嘗試了我遇到的一切,包括將:a;N;$!ba;
添加到不正常工作的位(並意識到失敗可怕)。
謝謝。 〜BAI1
它看起來像有一個以上的空間,或者一個TAB,前'at'。嘗試在那裏使用'\ s +'。 – Barmar
所以要簡短,你想刪除'[00:00:00] [服務器線程/ INFO]:在戰鬥中遇到錯誤。繼續...'和之後的所有錯誤行,不是嗎? –
@Barmar,我重寫了整個腳本,以確保在我發佈之前不會出現語法錯誤,包括「at」之前的tab/space事件的可能性。我仔細檢查了日誌,它實際上是「at」之前的一個選項卡,並且在第一個錯誤消除實例中使用選項卡不會導致問題。 – BAI1