我想将文本文件中的出生日期更改为其他日期 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/00
和19/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
。