我得到了一個帶有^$分隔符的檔案,文本如下:
tony^$36^$developer^$20210310^$CA
我想替換日期時間。我試過awk -F '\^\$' '{print $4}' file.txt | sed -i '/20210310/20221210/' ,但它什么都不回傳。然后我嘗試了 awk 部分,它什么也沒回傳,我想它仍然將這一行視為一個整體并且分隔符不起作用。想知道為什么以及如何解決它?
uj5u.com熱心網友回復:
一個簡單的解決方案是:
sed 's/\^\$/\n/g; s/20210310/20221210/g' -i file.txt
這將修改檔案以將每個部分分隔為new line.
如果您需要不同的分隔符,\n請將命令中的更改為空格 或,.. 由您決定。
它還將替換檔案中的日期。
如果要查看更改并真正修改檔案,請-i從命令中洗掉。
uj5u.com熱心網友回復:
當我運行您的awk命令時,我收到以下警告:
awk: warning: escape sequence `\^' treated as plain `^'
awk: warning: escape sequence `\$' treated as plain `$'
這解釋了為什么您的輸出為空:欄位分隔符被解釋為正則運算式 '^$',它匹配一個完全空白的行(僅)。因此,輸入的每個非空行都沒有任何欄位分隔符,因此只有一個欄位。 $4僅當至少有四個欄位時才能為非空。
您可以通過轉義反斜杠來解決這個問題:
awk -F '\\^\\$' '{print $4}' file.txt
如果您想要做的只是自己列印修改后的日期代碼 py,那么您就可以開始了。然而,問題...
如何使用多字符分隔符提取和替換列?
......像你這樣的聲音實際上可能要更換的日期代碼中的每一行,保持休息完好。在這種情況下,awk命令丟棄該行的其他部分是不可能的。您在這里有多種選擇,但其中兩個更有可能是
不要將欄位 4 發送給
sed替換,而是在awk腳本中執行 sub ,然后通過使用預期的分隔符列印所有欄位來重新構建輸入行。(這留作練習。)或做整個事情
sed:sed -E 's/^((([^^]|\^[^$])*\^\$){3})20210310(\^\$.*)/\120221210\4/' file.txt如果您想
file.txt就地修改,那么您可以添加-i標志(另一方面,這在您的原始命令中沒有用,其中sed的輸入來自管道而不是檔案)。該
-E選項使用 POSIX 擴展正則運算式方言,這使給定的正則運算式更具可讀性(替代方案需要更多\字符)。總的來說,假設有五個或更多欄位由文字 '^$' 字串分隔,第四個欄位正好包含“20210310”,匹配前三個欄位,包括它們的尾隨分隔符,并將它們全部捕獲為組 1;匹配第五個欄位的前導定界符和該行的所有其余部分,并將其捕獲為組 4;并用第 1 組后跟新日期代碼后跟第 4 組替換整行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390148.html
下一篇:將連續電報保存到不同的檔案夾中
