我试图在sed中编写一个脚本,该脚本将文件名作为参数。
我的目标是打印文件中至少包含3位数字的所有行。在第四个数字之后,所有的数字都应该被重复。我需要一个使用sed的解决方案。
示例输入文件:
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 我不知道怎么在第四位之后才能复制所有的数字。
发布于 2017-12-31 18:01:01
使用GNU,您可以执行以下操作:
$ 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以所需的方式运行。
-E标志只是为了方便起见;没有它,我们必须转义()和{}。
sed '/\([[:digit:]].*\)\{3\}/!d;s/[[:digit:]]/&&/5g' infile如果您的sed不理解-E,则可以使用-r。-E已被GNU接受多年(但没有文档),BSD也使用-E。POSIX将包括-E for sed,如文档所示的这里;但是,一些较旧的系统将只理解-r。
发布于 2017-12-31 17:46:54
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位)。然后复制所有数字,将其交换为容纳空间,将原始行带回模式空间。删除尾,然后将新尾从持有空间追加到模式空间。
https://stackoverflow.com/questions/48043244
复制相似问题