Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用sed在第8列的字符串中插入空格_Unix_Sed - Fatal编程技术网

Unix 使用sed在第8列的字符串中插入空格

Unix 使用sed在第8列的字符串中插入空格,unix,sed,Unix,Sed,需要在第8列中插入空格分隔日期和时间 输入文件: AAA|detail_hist|count|||766855||2014-08-2019:49:57 BBB|detail_hist|count|||766855||2014-07-2019:49:57 所需输出: AAA|detail_hist|count|||766855||2014-08-20 19:49:57 BBB|detail_hist|count|||766855||2014-07-20 19:49:57 通过sed $ sed

需要在第8列中插入空格分隔日期和时间

输入文件:

AAA|detail_hist|count|||766855||2014-08-2019:49:57
BBB|detail_hist|count|||766855||2014-07-2019:49:57
所需输出:

AAA|detail_hist|count|||766855||2014-08-20 19:49:57
BBB|detail_hist|count|||766855||2014-07-20 19:49:57
通过sed

$ sed 's/^\(.*\)\([0-9][0-9]:.*:.*\)$/\1 \2/g' file
AAA|detail_hist|count|||766855||2014-08-20 19:49:57
BBB|detail_hist|count|||766855||2014-07-20 19:49:57
您可以使用以下选项:

$ sed -r 's/[0-9]{4}-[0-9]{2}-[0-9]{2}/& /' file
AAA|detail_hist|count|||766855||2014-08-20 19:49:57
BBB|detail_hist|count|||766855||2014-07-20 19:49:57
它查找一个
XXXX-YY-ZZ
块,并将其替换为
XXXX-YY-ZZ
(即块+空格)

如果不支持
-r
,则需要转义每个
{}

sed 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/& /' file

如果结构与样品相同(第8列后无任何内容)

空间安全

sed 's/.\{8\} *$/ &/' YourFile

<代码> POSIX GNU SED

< P>我知道您请求了SED解决方案,但是当您谈到修改特定字段号时,您应该真正考虑AWK,因为它已经建立了对编号字段的支持:

$ awk 'BEGIN{FS=OFS="|"} {sub(/.{10}/,"& ",$8)} 1' file
AAA|detail_hist|count|||766855||2014-08-20 19:49:57
BBB|detail_hist|count|||766855||2014-07-20 19:49:57

不客气。我希望你能从答案中学到一些东西。简单一点:
sed-r的/([0-9]{2}:[0-9]{2}:[0-9]{2})$/\1/'文件
--“g”标记是不必要的,因为正则表达式是锚定的,因此每行只能匹配一次。虽然这在我的BSD和GNU
awk
v4上立即起作用,但我必须在GNU
awk
v3.*上启用
--re interval
。我一直想知道,如果
awk
默认使用ERE,为什么需要额外的选项?因为RE interval不是ERE语法的原始部分,所以gawk最初决定将
{10}
字面意思是字符{then 10 then},以实现向后兼容性。他们在gawk 4中更改了该决定,因此默认情况下会启用重新间隔。谢谢@EdMorton。现在这是有道理的。
$ awk 'BEGIN{FS=OFS="|"} {sub(/.{10}/,"& ",$8)} 1' file
AAA|detail_hist|count|||766855||2014-08-20 19:49:57
BBB|detail_hist|count|||766855||2014-07-20 19:49:57