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)' |'
我为自己的困境找到了一些 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)' |'