首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sed打印至少3位数字的行,在第4位后重复数字

sed打印至少3位数字的行,在第4位后重复数字
EN

Stack Overflow用户
提问于 2017-12-31 14:27:21
回答 2查看 736关注 0票数 2

我试图在sed中编写一个脚本,该脚本将文件名作为参数。

我的目标是打印文件中至少包含3位数字的所有行。在第四个数字之后,所有的数字都应该被重复。我需要一个使用sed的解决方案。

示例输入文件:

代码语言:javascript
运行
复制
abc 1 def2 3 ab45 z11
123 zy
ab1cd2ef3gh4z56
abc12aa

期望输出:

代码语言:javascript
运行
复制
abc 1 def2 3 ab455 z1111
123 zy
ab1cd2ef3gh4z5566

我试过的是:

代码语言:javascript
运行
复制
sed '/[0-9].*[0-9].*[0-9]/d' ./F1 

我不知道怎么在第四位之后才能复制所有的数字。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-31 18:01:01

使用GNU,您可以执行以下操作:

代码语言:javascript
运行
复制
$ 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标志只是为了方便起见;没有它,我们必须转义(){}

代码语言:javascript
运行
复制
sed '/\([[:digit:]].*\)\{3\}/!d;s/[[:digit:]]/&&/5g' infile

如果您的sed不理解-E,则可以使用-r-E已被GNU接受多年(但没有文档),BSD也使用-E。POSIX将包括-E for sed,如文档所示的这里;但是,一些较旧的系统将只理解-r

票数 6
EN

Stack Overflow用户

发布于 2017-12-31 17:46:54

sed绝对是一个错误的工具,但它是一个有趣的挑战:

代码语言:javascript
运行
复制
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位)。然后复制所有数字,将其交换为容纳空间,将原始行带回模式空间。删除尾,然后将新尾从持有空间追加到模式空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48043244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档