以下是文件的内容,我只需要打印“[]”中包含的票号。很想知道是否可以使用 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
答案1
您可以使用 GNU grep
:
$ grep -oP '/\K\d+(?=])' ticket
26727777
25709048
26716590
23995808
或者sed
:
sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808
上述两者都适用于您给出的示例,但它们是否适用于您的真实文件将取决于文件中的其他行。它们打印 a 之后的所有数字/
,对于grep
,打印 a 之前的所有数字]
。如果您还有其他符合这些条件的行,您将需要向我们展示您的整个文件。
答案2
我个人会使用perl。
perl -lne 'print /(\d+)\]/'
应该做到这一点。
-l
说“整理换行符” - 它会自动将它们从行中删除,并将它们插入到每个print
.
-n
说'将其包装在一个while (<>) {
循环中 - 它像会那样逐行迭代 STDIN (或文件)grep
。
并且-e
是“表达式”(或“执行”我猜)来运行引号中的命令。 (否则perl
请从 读取程序STDIN
)
我们使用正则表达式的默认匹配是 against $_
(在这种情况下,即当前行)这一事实。
因为我们指定了一个捕获组,所以它返回捕获值的(单个元素)列表,而不是返回“true”或“false”:
\d+
是一位或多位数字。 (这是一个“高级”正则表达式,与 大致相似[0-9]+
,但如果您使用非拉丁数字,其工作方式会有所不同),并且我们需要在]
其后面添加一个。
并且因为我们不g
在正则表达式的末尾使用,每行仅匹配一次。
答案3
sed 's/[^0-9]*\([0-9]*\).*/\1/'
但如果票号有固定宽度,我宁愿使用cut
.
编辑:使用 grep:
grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'
答案4
tr "\[\]/" " "| awk '/request/ { print $3 }'