我有两种类型的输出:
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
答案 0 :(得分: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
答案 1 :(得分:0)
awk
救援?
$ awk -F"[: ]" '{print $2":"$3}' file
474D229F698D494E889D85CEF9303B97:480
474D229F698D494E889D85CEF9303B97:480
解释:我们定义了不同的可能字段分隔符:
或空格。文本分割后,我们打印第2和第3个字段。
sed
方式如下:
$ sed 's/UID:\([^:]*\):\([^ ]*\).*/Captured:\1:\2/g' file
Captured:474D229F698D494E889D85CEF9303B97:480
Captured:474D229F698D494E889D85CEF9303B97:480
解释:我们看到文本基于模式UID:number:number something
。因此,我们使用UID:\([^:]*\):\([^ ]*\).*
得到它。使用\( expression \)
,我们会捕获所需的文字,以便稍后可以使用\1
,\2
打印...
答案 2 :(得分:0)
在bash中,您可以使用参数扩展:
s=${s% *} # Remove everything after space.
echo ${s#*:} # Remove everything before colon.