以下是文件的内容,我只需要打印附在"[]“中的票号。很想知道是否可以使用sed和grep命令来完成这一任务。
[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产出应是:
26727777
25709048
26716590
23995808我尝试了sed -e 's/[^0-9]//g' ticket | sed '/^$/d',但无法获得所需的输出。它还包括行中的其他数值,我只需要获得票证编号:
226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216发布于 2016-02-19 11:47:20
我个人会使用perl。
perl -lne 'print /(\d+)\]/'应该能起作用。
-l的意思是“排序linefeed”--它会自动将它们从行中剥离出来,并在每个print之后插入它们。
-n说,‘将它封装在一个while (<>) {循环中--它逐行迭代STDIN (或文件),就像grep那样。
-e是以引号形式运行命令的“表达式”(或“执行”)。(否则perl从STDIN读取程序)
我们使用的事实是,正则表达式的默认匹配是针对$_的(在此上下文中,这是当前行)。
因为我们指定了一个捕获组,而不是返回"true“或"false”,所以它返回捕获值的(单个元素)列表:
\d+是一个或多个数字。(这是一个“高级”正则表达式,与[0-9]+大致相似,但如果使用非拉丁语数字,它的工作方式会有所不同),我们需要在它之后使用一个]。
而且,由于在正则表达式的末尾不使用g,所以它每一行只匹配一次。
发布于 2016-02-19 12:08:48
您可以使用GNU grep:
$ grep -oP '/\K\d+(?=])' ticket
26727777
25709048
26716590
23995808或者sed:
sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808以上两种方法都适用于您所给出的示例,但它们是否适用于您的实际文件将取决于您文件中的其他行。它们打印/后面的所有数字,对于grep则打印在]之前的所有数字。如果您有符合这些条件的其他行,则需要向我们展示您的整个文件。
发布于 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]*'
https://unix.stackexchange.com/questions/264320
复制相似问题