Bash sed打印一行,其中至少有3位数字与第4位数字后的数字重复
我正试图在Bash sed打印一行,其中至少有3位数字与第4位数字后的数字重复,bash,shell,unix,sed,Bash,Shell,Unix,Sed,我正试图在sed中编写一个脚本,该脚本获取一个文件名作为参数 我的目标是打印文件中至少包含3行的所有行 数字。在第4位之后,所有数字都应重复。我需要一个使用sed的解决方案 示例输入文件: abc 1 def2 3 ab45 z11 123 zy ab1cd2ef3gh4z56 abc12aa abc 1 def2 3 ab455 z1111 123 zy ab1cd2ef3gh4z5566 所需输出: abc 1 def2 3 ab45 z11 123 zy ab1cd2ef3gh4z56
sed
中编写一个脚本,该脚本获取一个文件名作为参数
我的目标是打印文件中至少包含3行的所有行
数字。在第4位之后,所有数字都应重复。我需要一个使用sed
的解决方案
示例输入文件:
abc 1 def2 3 ab45 z11
123 zy
ab1cd2ef3gh4z56
abc12aa
abc 1 def2 3 ab455 z1111
123 zy
ab1cd2ef3gh4z5566
所需输出:
abc 1 def2 3 ab45 z11
123 zy
ab1cd2ef3gh4z56
abc12aa
abc 1 def2 3 ab455 z1111
123 zy
ab1cd2ef3gh4z5566
我所尝试的:
sed '/[0-9].*[0-9].*[0-9]/d' ./F1
我不知道如何只在第四位数字之后复制所有数字。
sed
绝对是错误的工具,但这是一个有趣的挑战:
sed -E -e '/([^0-9]*[0-9]){3}/{ h; s///;
s/([0-9])/\1\1/g; x; s/(([^0-9]*[0-9]){3}).*/\1/; G; s/\n//; }' input
基本上,你按住线,然后去掉前导部分(前3位)。然后复制所有数字,将其交换到保留空间中,使原始行返回到图案空间。删除尾部,然后将新尾部从保留空间追加回模式空间。使用GNU sed,可以执行以下操作:
$ sed -E '/([[:digit:]].*){3}/!d;s/[[:digit:]]/&&/5g' infile
abc 1 def2 3 ab455 z1111
123 zy
ab1cd2ef3gh4z5566
第一个命令,/([[:digit:].*){3}/!d
,删除所有不包含至少三位数字的行
第二个命令,s/[:digit:][]/&&5g
,重复数字;5g
标志转换为“从第五次开始的每次事件”。POSIX未指定将数字标志与g
混合时的行为;GNU sed以期望的方式运行
-E
标志只是为了方便起见;没有它,我们必须逃避()
和{}
:
sed '/\([[:digit:]].*\)\{3\}/!d;s/[[:digit:]]/&&/5g' infile
如果您的sed不理解
-E
,您可以使用-r
-E
已被GNU sed接受多年(但未记录),BSD sed也使用-E
。POSIX将包括sed的-E
,如文件所述;一些旧系统只能理解-r
。这是家庭作业,对吗?由于问题非常不清楚,请你的老师澄清一下。请问s//代码>工作?也许有点指向文档?一个空模式重复最后一个匹配。但是,这不是从第4位开始重复数字,而不是第5位吗?@PesaThe请参见“空正则表达式…”BenjaminW。谢谢,我不知道。我一定要复习一下我的sed
技能。是的,它甚至会重复第四位。@Micael对不起,我的意思是“改进”,而不是在你提出好的观点时“拒绝”你的编辑,但我点击错了。。。