1

我有这两种类型的输出:

UID:474D229F698D494E889D85CEF9303B97:480 f
UID:474D229F698D494E889D85CEF9303B97:480

我想得到 32 字符长的 uid,最后是 480。(注意第二类输入480之后什么都没有)期望的输出:

474D229F698D494E889D85CEF9303B97:480
474D229F698D494E889D85CEF9303B97:480

我正在使用 sed:

cat input.txt | sed 's!UID:\(.*\):\([0-9]*\)[\s]*!Captured:\1:\2!'

但输出是:

Captured:474D229F698D494E889D85CEF9303B97:480 f
Captured:474D229F698D494E889D85CEF9303B97:480
4

3 回答 3

1

这个可以吗?

grep -oE '[^:]{32}:[^: ]*' file

例如:

kent$  echo "UID:474D229F698D494E889D85CEF9303B97:480 f
UID:474D229F698D494E889D85CEF9303B97:480"|grep -oE '[^:]{32}:[^: ]*'
474D229F698D494E889D85CEF9303B97:480
474D229F698D494E889D85CEF9303B97:480

与sed相同的想法:

sed -r 's/.*([^:]{32}:[^: ]*).*/\1/' file
于 2013-07-24T14:17:22.330 回答
0

awk救援?

$ awk -F"[: ]" '{print $2":"$3}' file
474D229F698D494E889D85CEF9303B97:480
474D229F698D494E889D85CEF9303B97:480

说明:我们定义了不同的可能的字段分隔符:或空格。一旦文本被分割,然后我们打印第二个和第三个字段。

sed方式可能如下:

$ sed 's/UID:\([^:]*\):\([^ ]*\).*/Captured:\1:\2/g' file
Captured:474D229F698D494E889D85CEF9303B97:480
Captured:474D229F698D494E889D85CEF9303B97:480

解释:我们看到的文字是基于图案的UID:number:number something。因此,我们得到它UID:\([^:]*\):\([^ ]*\).*。随着\( expression \)我们捕获我们需要的文本,以便稍后可以使用\1, \2...

于 2013-07-24T14:14:04.137 回答
0

在 bash 中,您可以使用参数扩展:

s=${s% *}    # Remove everything after space.
echo ${s#*:} # Remove everything before colon.
于 2013-07-24T14:15:30.260 回答