使用正则表达式来更改出生日期

使用正则表达式来更改出生日期

我想将文本文件中的出生日期更改为其他日期 11/14/46。我想在不知道之前的出生日期的情况下执行此操作,而是能够进行一般搜索。我知道与出生日期相关的人的名字,因此我可以使用它来进行替换

我尝试过这个:

sed "s/^PersonsName\/[1-12]\/[0-31]\/[0-99]/11\/14\/46/g" txt.file

但它不起作用,我不知道该怎么做


下面建议的答案对我不起作用。我将提供一些示例数据,看看这是否有助于澄清问题。

Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:3/19/35:22350

假设我试图更改大力水手的出生日期(在最后),但我想在不知道他当前出生日期的情况下进行搜索。我知道使用正则表达式是关键,但到目前为止,我看到的示例都没有奏效。也许提供上述示例数据会有所帮助

[预期成果]

Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350

我唯一感兴趣的是改变最后的出生日期11/14/46

答案1

您可以使用以下 sed 命令,

$ sed '/^Popeye Sailor:/s/:[^:]*\(:[^:\/]*\)$/:11\/14\/46\1/' file
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350

它只更改以下列行开头的日期Popeye Sailor:

答案2

[1-12]\/[0-31]并不[0-99]表示 1 到 12、0 到 31 和 0 到 99。

  • [1-12]表示从 1 开始到 1 和 2 的字符范围。本质上:[12]。 (与 。 比较[0-1a]
  • [0-31] 表示从 0 到 3 的字符范围,以及 1: [0123]

对于 也类似[0-99]。用正则表达式表达数字范围并不容易。

如果数字不使用双位数(01/06/33),则必须执行类似以下操作: [0-9]{1,2}表示日和月,以及[0-9]{2}表示年,否则正则表达式很快就会变得难以处理。当然,这会冒着选择 之类的风险99/99/99

例如:

$ sed "s/^\(muru\/\)[0-9]\{1,2\}\/[0-9]\{1,2\}\/[0-9]\{2\}/\111\/14\/46/g" <<<'muru/1/4/85'
muru/11/14/46
$ sed "s/^\(muru\/\)[0-9]\{1,2\}\/[0-9]\{1,2\}\/[0-9]\{2\}/\111\/14\/46/g" <<<'muru/10/4/85'
muru/11/14/46
$ sed "s/^\(muru\/\)[0-9]\{1,2\}\/[0-9]\{1,2\}\/[0-9]\{2\}/\111\/14\/46/g" <<<'muru/10/28/85'
muru/11/14/46

我假设你想保留这个名字,所以我用了反向引用在替换中引用它(\1)。

答案3

日期为棘手的,但简化程度与您的尝试类似……

sed -r 's,^PersonsName1?[0-9]/[1-3]?[0-9]/[0-9]{2},11/14/46,' txt.file

解释

  • 用于-r扩展正则表达式。这允许(例如)?
  • 一般来说,我更喜欢使用单引号'而不是双引号",这样就不会出现 shell 扩展。
  • 除了使用 之外,您还可以使用任何您想要的分隔/sed。这里我使用了,,这样我们就不需要转义文字/s 了。
  • 1?[0-9]1匹配月份的可选且必需的 0-9。
  • [1-3]?[0-9]匹配和可选的 1-3,以及当天必需的 0-9。
  • [0-9]{2}匹配两位数字表示年份。
  • 注意,这可能会产生一些错误匹配。例如0/0/0019/39/99将匹配,但您可以根据需要进一步调整正则表达式。有关更多信息,请参阅上面的链接。

更多评论

请注意,这会匹配类似 的内容PersonsName11/11/11,并替换整个内容,类似于您尝试执行的操作。如果您只想替换日期,则可以使用以下内容。

sed -r 's,^(PersonsName)1?[0-9]/[1-3]?[0-9]/[0-9]{2},\111/14/46,' txt.file

这里,我们PersonsName使用括号捕获 。然后我们可以在替换部分使用 再次引用它\1

相关内容