在所有文件的日期时间字符串中用冒号替换空格

时间:2016-02-22 12:07:40

标签: regex bash sed

我目前运行一些python代码,将一组值与日期时间字符串一起输出到大约400个文本文件中。输出具有不同的值但格式相同。

我在某些时候更改了日期时间字符串的格式,以便在天和小时之间使用冒号而不是空格。所以现在我需要编辑以前的空白版本以匹配当前版本。 样本:

2016/02/11 12:54:28 0071754407 7599 4727 2690
2016/02/11 14:07:41 0071754407 7599 4726 2690 
2016/02/11:15:26:58 0071754407 7599 4725 2690 
2016/02/11:17:12:59 0071754407 7599 4722 2690 
2016/02/11:19:01:21 0071754407 7599 4721 2690 

我正在使用sed similar to this 我目前的尝试看起来像是这样

find . -name '*.txt' | sed -ei 's'\d\/\d\s\d\d\:''\d\/\d\:\d\d\:g'

正如你所看到的,我不知道sed如何处理正则表达式。我也不确定sed的后缀,我读到我允许写入同一个文件而e是表达式。

任何指导都将不胜感激。

2 个答案:

答案 0 :(得分:1)

正如评论中正确指出的那样,您无法修改<select>上读取的文件,因此您需要stdin循环播放while循环,以便您在 filename 。类似于:

find

注意>您可以在while read -r name; do sed -i 's/^\([^ ]*\)[ ]\(.*$\)/\1:\2/' "$name" done < <(find . -name "*.txt") 选项中添加-i.bak,让-i为其修改的每个文件创建备份文件。

示例输入

sed

<强>输出

$ cat file
2016/02/11 12:54:28 0071754407 7599 4727 2690
2016/02/11 14:07:41 0071754407 7599 4726 2690

答案 1 :(得分:1)

这应该可以解决问题:

find . -name '*.txt' -exec sed -i -e 's_^\(..../../..\) \(..:..:..\)_\1:\2_' {} \;

说明:

find -exec命令会针对它在当前路径(sed)中标识的每个文件名调用.

-i告诉sed修改原始输入文件,而不是将其输出转储到标准输出。

-e告诉sed使用命令行后面提供的替换模式。

我们使用_作为s替换命令的分隔符。

我们自由地使用任何字符匹配(。)来匹配我们假设为时间戳的内容。我们从行(^)的开头开始,并将时间戳的两个部分匹配到替换变量\ 1和\ 2中。

(如果我们在该线上找到的内容与我们的包含斜线和冒号的图案不匹配,我们是否会触摸它。)

最后一部分{} \;是我们-exec的{​​{1}}命令的结尾。它将文件名附加到find命令的末尾并终止该命令。