Mic*_*los 2 unix bash shell sed
我正在尝试编写一个脚本,sed
以获取文件名作为参数.
我的目标是打印文件中包含至少3位数的所有行.在第4位之后,应重复所有数字.我需要一个解决方案sed
.
示例输入文件:
abc 1 def2 3 ab45 z11
123 zy
ab1cd2ef3gh4z56
abc12aa
Run Code Online (Sandbox Code Playgroud)
期望的输出:
abc 1 def2 3 ab455 z1111
123 zy
ab1cd2ef3gh4z5566
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
sed '/[0-9].*[0-9].*[0-9]/d' ./F1
Run Code Online (Sandbox Code Playgroud)
我不知道如何才能在第4位之后复制所有数字.
使用GNU sed,您可以执行以下操作:
$ sed -E '/([[:digit:]].*){3}/!d;s/[[:digit:]]/&&/5g' infile
abc 1 def2 3 ab455 z1111
123 zy
ab1cd2ef3gh4z5566
Run Code Online (Sandbox Code Playgroud)
第一个命令/([[:digit:]].*){3}/!d
删除所有不包含至少三位数的行.
第二个命令s/[[:digit:]]/&&/5g
,重复数字; 该5g
标志转换为"从第五个开始的每一次出现".g
POSIX没有指定混合数字标志时的行为; GNU sed以所需的方式运行.
该-E
标志仅仅是为了方便; 没有它,我们必须逃跑()
和{}
:
sed '/\([[:digit:]].*\)\{3\}/!d;s/[[:digit:]]/&&/5g' infile
Run Code Online (Sandbox Code Playgroud)
如果你的sed不明白-E
,你可以-r
改用.-E
已被GNU sed接受多年(但未被记录),并且BSD seds也被使用-E
.POSIX将包括-E
sed,如此处所述 ; 但是,一些较旧的系统只能理解-r
.