我為我的困境找到了一些 sed 示例。當前的文本檔案如下所示。
076411-160DL 0000000052220420 000005212635883-0003-0
138574A 0000000120220421 000012012630637-0003-1
146054A 0000000420220422 000042012634007-0003-1
138575A 0000000240220421 000024012630638-0003-1
145683C 0000000145220422 000014512634671-0003-1
137611B 0000000130220419 000013012632286-0003-0
137618C 0000000120220420 000012012635623-0003-0
我只在第二列中更改日期,但我需要保持原樣,只需更改為當前日期,然后更改為新檔案。我將第一部分分開使用grep -v "\0003-0" *.txt然后我將 0003-0 分開,grep -h "\0003-0"然后使用 sed 更改格式,這幾乎就在那里,但由于日期前面的數字不一致。
sed -r "s/[2]{2}[0-8]{2}[0-9]{2}/$(date ' %y%m%d')/g"
我主要按照我想要的方式得到它,但是如果在日期之前有一個包含 8 個零且只有 1 個其他數字的組,我會在新日期結束時得到一些東西,例如 9 或 0。任何提示都會很棒。謝謝
我只是更改檔案以 0003-0 結尾的日期。直到現在我才知道第一列之前有一個空格。
預期輸出將是
076411-160DL 0000000052220425 000005212635883-0003-0
138574A 0000000120220421 000012012630637-0003-1
146054A 0000000420220422 000042012634007-0003-1
138575A 0000000240220421 000024012630638-0003-1
145683C 0000000145220422 000014512634671-0003-1
137611B 0000000130220425 000013012632286-0003-0
137618C 0000000120220425 000012012635623-0003-0
uj5u.com熱心網友回復:
sed向 OP 的當前代碼添加模式匹配:
$ sed -r "/-0003-0$/s/[2]{2}[0-8]{2}[0-9]{2}/$(date ' %y%m%d')/g" file
076411-160DL 0000000052204250 000005212635883-0003-0
138574A 0000000120220421 000012012630637-0003-1
146054A 0000000420220422 000042012634007-0003-1
138575A 0000000240220421 000024012630638-0003-1
145683C 0000000145220422 000014512634671-0003-1
137611B 0000000130220425 000013012632286-0003-0
137618C 0000000120220425 000012012635623-0003-0
但這無法更新第一行。
解決“中間”欄位的一種可能調整:
$ sed -r "/-0003-0$/s/( [0-9]{10})([0-9]{6}) /\1$(date ' %y%m%d') /" file
076411-160DL 0000000052220425 000005212635883-0003-0
138574A 0000000120220421 000012012630637-0003-1
146054A 0000000420220422 000042012634007-0003-1
138575A 0000000240220421 000024012630638-0003-1
145683C 0000000145220422 000014512634671-0003-1
137611B 0000000130220425 000013012632286-0003-0
137618C 0000000120220425 000012012635623-0003-0
uj5u.com熱心網友回復:
建議單個sed命令:
sed -r '/0003-0$/s|([[:digit:]]{6}) |'$(date %y%m%d)' |'
uj5u.com熱心網友回復:
date=$(date %y%m%d)
sed -E '/0003-0$/{s/ ([^ ]{1,10})[^ ]* / \1'"$date"' /2}'
請注意,您的資料在第一列之前有一個空格。
解釋:
TLDR:創建一個匹配欄位的模式,該模式還捕獲(最多)欄位的前十個字符以進行反向參考,并替換第二個欄位。
- 首先,過濾以 . 結尾的行
0003-0。 - 然后使用“空格,然后至少一個非空格字符,然后是空格”的模式定位每行的第二個欄位。
- 最后
2的 表示替換匹配模式的第二個(或 N 個)實體。因此,我們的模式僅針對第二個欄位。 - 該模式捕獲(最多)該欄位的前十個字符(使用括號),因此我們可以在替換中反向參考它們(使用
\1)并丟棄剩余的(六個)日期字符,我們將其替換為$date。 {1,10}需要是至少一個字符的范圍,因為它必須同時匹配第一個和第二個欄位,以便我們能夠用 . 指定第二個欄位2。
編輯:
給出:
076411-160DL 0000000052220426 000005212635883-0003-0
138574A 0000000120220421 000012012630637-0003-1
146054A 0000000420220422 000042012634007-0003-1
138575A 0000000240220421 000024012630638-0003-1
145683C 0000000145220422 000014512634671-0003-1
137611B 0000000130220426 000013012632286-0003-0
137618C 0000000120220426 000012012635623-0003-0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/464141.html
