shell 更改字符串中的日期

shell change date within a string

我为自己的困境找到了一些 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 "[=14=]03-0" *.txt 分隔了第一部分然后我用 grep -h "[=15=]03-0" 分隔了 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 的日期 在第一列之前有一个 space 直到现在我才知道。

预期输出为

 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

将模式匹配添加到 OP 的当前 sed 代码:

$ 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

但这无法更新第一行。

解决 'middle' 字段的一个可能调整:

$ sed -r "/-0003-0$/s/( [0-9]{10})([0-9]{6}) /$(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
date=$(date +%y%m%d)
sed -E '/0003-0$/{s/ ([^ ]{1,10})[^ ]* / '"$date"' /2}'

请注意,您的数据在第一列之前有一个 space。

解释:

TLDR:创建一个匹配字段的模式,它还捕获(最多)字段的前十个字符作为 back-reference,并替换第二个字段。

  • 首先,过滤以 0003-0.
  • 结尾的行
  • 然后通过使用“space,然后至少一个 non-space 字符,然后 space” 的模式来定位每一行的第二个字段。
  • 最后的2表示替换匹配模式的第二个(或N个)实例。因此,我们的模式仅针对第二个字段。
  • 该模式捕获(最多)该字段的前十个字符(使用括号),因此我们可以在替换中 back-reference 它们(使用 </code>)并丢弃剩余的(六个) 日期字符,我们将其替换为 <code>$date.
  • {1,10} 需要是至少一个字符的范围,因为它必须匹配第一个和第二个字段,使我们能够用 2.[=34 指定第二个字段=]

编辑:

给出:

 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

建议单个 sed 命令:

 sed -r '/0003-0$/s|([[:digit:]]{6}) |'$(date +%y%m%d)' |'