首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SED能够将这个prefix=a,b,c,d拆分成那个prefix=a \n prefix=b \n prefix=c

SED能够将这个prefix=a,b,c,d拆分成那个prefix=a \n prefix=b \n prefix=c
EN

Stack Overflow用户
提问于 2019-07-18 09:56:40
回答 6查看 83关注 0票数 0

有一个日志文件,其中包含以下数据:2019-07-18 12:00:00,000 login1 abc-def-geh 2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij

我试图使用sed (或任何其他bash文本处理工具)处理该文件,以获得以下输出:2019-07-18 12:00:00,000 login1 abc-def-geh 2019-07-18 12:00:00,001 login2 abc-def-geh 2019-07-18 12:00:00,001 login2 bcd-efg-hij

或者反过来说:

  • 我需要捕捉线的一部分(从一开始到登录信息)
  • 我需要将行的其余部分拆分为“",即分隔ID。
  • 每一行都需要包含捕获的部分(日期、时间、登录)+ ID
EN

回答 6

Stack Overflow用户

发布于 2019-07-18 10:08:36

代码语言:javascript
复制
awk '$NF~/,/{split($NF,a,",");$NF="";for(x in a)print $0a[x];next}7' file

这句话会有帮助的。

是的,这类部件最多可达数百个(IDs)。

  • 它也会成功的。
票数 1
EN

Stack Overflow用户

发布于 2019-07-18 10:19:57

Perl是实现目标的更慷慨的工具。试试这个:

代码语言:javascript
复制
perl -nle 'm/(.*) (\S+) (\S+)$/; print "$1 $2 $_" foreach split ",", $3'
票数 1
EN

Stack Overflow用户

发布于 2019-07-18 10:32:32

代码语言:javascript
复制
sed ': c; s/^\([^ ]\+ [^ ]\+ [^ ]\+\) \([^\n,]\+\),\(.*\)/\1 \3\n\1 \2/; t c; s/\([^\n]*\)\n\(.*\)/\2\n\1/'
  • : c声明标签c (来自“继续”的简短助记符)
  • ^\([^ ]\+ [^ ]\+ [^ ]\+\) -匹配前三部分
  • \([^\n,]\+\) -匹配第一部分直到逗号。当找到换行符时也停止匹配,这在以后很重要.
  • , --如果我们在换行符处停下来,我们就应该停止处理。如果我们在逗号处停下来,我们应该匹配一个逗号。
  • \(.*\) -记住逗号后面的其他部分。
  • \1 \3\n\1 \2 --在输入的末尾添加匹配的部分。因此,在下一次迭代中,我们可以一次一次地匹配(一次又一次……)。我们停止matchine,然后\3不再有逗号,那么\([^\n,]\+\),正则表达式部分就会失败,因为没有逗号。
  • t c --如果最后的s///命令成功,则将分支标记为c。直到逗号为字符串时,s///才会成功。
  • s/\([^\n]*\)\n\(.*\)/\2\n\1/ --将第一行移动到最后一行。没有它,最后的模式将是第一个。只需匹配第一行并移动它。

测试(随机输入以获得更多的输入数据):

代码语言:javascript
复制
cat <<EOF |
2019-07-18 12:00:00,000 login1 abc-def-geh
2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij
2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij,bfdsabfasdh
2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij,bfdsabfasdh,fdsmfasfda,f,da,dfas,fd,asf,das,fsd,af,a,fdsafasdfsda,fasd
EOF
sed ': c; s/^\([^ ]\+ [^ ]\+ [^ ]\+\) \([^\n,]\+\),\(.*\)/\1 \3\n\1 \2/; t c; s/\([^\n]*\)\n\(.*\)/\2\n\1/'

将产出:

代码语言:javascript
复制
2019-07-18 12:00:00,000 login1 abc-def-geh
2019-07-18 12:00:00,001 login2 abc-def-geh
2019-07-18 12:00:00,001 login2 bcd-efg-hij
2019-07-18 12:00:00,001 login2 abc-def-geh
2019-07-18 12:00:00,001 login2 bcd-efg-hij
2019-07-18 12:00:00,001 login2 bfdsabfasdh
2019-07-18 12:00:00,001 login2 abc-def-geh
2019-07-18 12:00:00,001 login2 bcd-efg-hij
2019-07-18 12:00:00,001 login2 bfdsabfasdh
2019-07-18 12:00:00,001 login2 fdsmfasfda
2019-07-18 12:00:00,001 login2 f
2019-07-18 12:00:00,001 login2 da
2019-07-18 12:00:00,001 login2 dfas
2019-07-18 12:00:00,001 login2 fd
2019-07-18 12:00:00,001 login2 asf
2019-07-18 12:00:00,001 login2 das
2019-07-18 12:00:00,001 login2 fsd
2019-07-18 12:00:00,001 login2 af
2019-07-18 12:00:00,001 login2 a
2019-07-18 12:00:00,001 login2 fdsafasdfsda
2019-07-18 12:00:00,001 login2 fasd

注意,在替换列表中使用sed内部的\n是一个gnu扩展。

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

https://stackoverflow.com/questions/57091846

复制
相关文章

相似问题

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