Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash Unix shell脚本在文件中查找字符串,然后通过添加字符或数字进行追加_Bash_Shell_Unix_Solaris - Fatal编程技术网

Bash Unix shell脚本在文件中查找字符串,然后通过添加字符或数字进行追加

Bash Unix shell脚本在文件中查找字符串,然后通过添加字符或数字进行追加,bash,shell,unix,solaris,Bash,Shell,Unix,Solaris,是否有人可以帮助我在文件中的字符串中添加零 例如:我有test.dat,它包含如下内容: 1名姓氏A+2015042113:00:00000 285000 FSCRD库存0 2姓氏姓氏B+2015042220:00:00000 331000SSESA INV 0 和我想创建一个shell脚本来编辑FIE中的一个字符串,在字符串中间插入三(3)个零。 因此,预期的输出将是:我加粗了三个零,如下所示 01名字姓氏A+2015042113:00:00000000285000 FSCRD库存0 02名字

是否有人可以帮助我在文件中的字符串中添加零

例如:我有test.dat,它包含如下内容:

1名姓氏A+2015042113:00:00000 285000 FSCRD库存0 2姓氏姓氏B+2015042220:00:00000 331000SSESA INV 0

和我想创建一个shell脚本来编辑FIE中的一个字符串,在字符串中间插入三(3)个零。 因此,预期的输出将是:我加粗了三个零,如下所示

01名字姓氏A+2015042113:00:00000000285000 FSCRD库存0

02名字姓氏B+2015042220:00:PM000000331000SSESA INV 0

您可以使用

awk -F : '{print $1":"$2":"substr($3,1,2)"000"substr($3,3)}' test.dat


您可以将
sed
regex
一起使用:

sed 's/\(:..:..\)/\1000/' test.dat 
它查找模式
:…:…
(点是任意字符,因此它查找“冒号、任意字符、任意字符、冒号、任意字符、任意字符”)并向其添加3个零

sed "s/\(+[0-9]\{10\}:[0-9]\{2\}:[A-Z0-9]\{2\}\)\([A-Z0-9]\{16\}\)/\1000\2/"
sed
命令用于匹配整个第五个字段,然后插入三个零。这将更加健壮(与较短的
regex
)以防止替换行的其他部分


如果第五个字段有规范,则可以使
regex
更强大

您可以定义要添加零的位置吗?假设这是以制表符分隔的,并且第五个字段的开头包含一个固定长度的日期戳,
awk-F'\t'{$5=substr($5,1,17)“000”substr($5,18)}1'文件
将满足您的要求。在第二个示例中,您添加了
PM0
,而不是
000
。请澄清。@Ohad Eytan——我用粗体突出了它。我看到了我正在寻找的示例definition@MDogru-如果FirstName有两个名称,如“johnadam”,并且文件不是以制表符分隔的,而是以空格分隔的,那么$5将是一个问题。有什么想法吗?谢谢你的回复。我想说,这种模式匹配确实很有挑战性。@Neo:我将FS改为:也许这可以帮助你;多格鲁先生-看来会有用的。我在打击非法行动。我需要在solaris 10中的某个bin calling-r上更新shell。多谢!!
sed "s/\(+[0-9]\{10\}:[0-9]\{2\}:[A-Z0-9]\{2\}\)\([A-Z0-9]\{16\}\)/\1000\2/"