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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 sed打印一行,其中至少有3位数字与第4位数字后的数字重复_Bash_Shell_Unix_Sed - Fatal编程技术网

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对不起,我的意思是“改进”,而不是在你提出好的观点时“拒绝”你的编辑,但我点击错了。。。