bash sed处理数据与行尾或其他可能的东西

时间:2013-07-24 14:11:42

标签: bash sed whitespace end-of-line

我有两种类型的输出:

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

3 个答案:

答案 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.