首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只打印票号?

如何只打印票号?
EN

Unix & Linux用户
提问于 2016-02-19 10:58:38
回答 4查看 1.2K关注 0票数 -3

以下是文件的内容,我只需要打印附在"[]“中的票号。很想知道是否可以使用sed和grep命令来完成这一任务。

代码语言:javascript
复制
[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN 
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary

产出应是:

代码语言:javascript
复制
26727777
25709048
26716590
23995808

我尝试了sed -e 's/[^0-9]//g' ticket | sed '/^$/d',但无法获得所需的输出。它还包括行中的其他数值,我只需要获得票证编号:

代码语言:javascript
复制
226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216
EN

回答 4

Unix & Linux用户

发布于 2016-02-19 11:47:20

我个人会使用perl。

代码语言:javascript
复制
perl -lne 'print /(\d+)\]/'

应该能起作用。

-l的意思是“排序linefeed”--它会自动将它们从行中剥离出来,并在每个print之后插入它们。

-n说,‘将它封装在一个while (<>) {循环中--它逐行迭代STDIN (或文件),就像grep那样。

-e是以引号形式运行命令的“表达式”(或“执行”)。(否则perlSTDIN读取程序)

我们使用的事实是,正则表达式的默认匹配是针对$_的(在此上下文中,这是当前行)。

因为我们指定了一个捕获组,而不是返回"true“或"false”,所以它返回捕获值的(单个元素)列表:

\d+是一个或多个数字。(这是一个“高级”正则表达式,与[0-9]+大致相似,但如果使用非拉丁语数字,它的工作方式会有所不同),我们需要在它之后使用一个]

而且,由于在正则表达式的末尾不使用g,所以它每一行只匹配一次。

票数 1
EN

Unix & Linux用户

发布于 2016-02-19 12:08:48

您可以使用GNU grep

代码语言:javascript
复制
$ grep -oP '/\K\d+(?=])' ticket 
26727777
25709048
26716590
23995808

或者sed

代码语言:javascript
复制
sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808

以上两种方法都适用于您所给出的示例,但它们是否适用于您的实际文件将取决于您文件中的其他行。它们打印/后面的所有数字,对于grep则打印在]之前的所有数字。如果您有符合这些条件的其他行,则需要向我们展示您的整个文件。

票数 1
EN

Unix & Linux用户

发布于 2016-02-19 11:25:50

sed 's/[^0-9]*\([0-9]*\).*/\1/'

但是如果票号有固定的宽度,我宁愿使用cut

编辑: with grep:grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'

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

https://unix.stackexchange.com/questions/264320

复制
相关文章

相似问题

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