使用SED匹配两个字符串部分

时间:2014-12-19 17:32:27

标签: sed

我只需要从字符串中打印出我想要的部分。例如:

10/11/12 05:34:34 Writer has an issue. Check this info [Avg. 12 write issues found]

我想匹配"10/11/12 05:34:34 Writer""[Avg. 12 write issues found]" 作家有时候可能是读者,所以我也需要考虑。 Regexp是完全需要的,但是我用sed尝试的东西都没有让我获得字符串的两个部分。顺便说一句,我使用solaris 10所以那里的sed版本不支持-r参数:(

我目前处理字符串两次并将结果放在一个变量中,这样我就可以在最后打印两个变量。但是,我想在一行代码中执行此操作

如何从字符串中打印出我需要的两个部分?

谢谢

2 个答案:

答案 0 :(得分:1)

尝试这样做:

sed -r 's/^(.*(Reader|Writer)).*(\[.*\])/\1 \3/' file

最后:

$ oIFS="$IFS"
$ IFS=$'\n'; arr=( $(sed -r 's/^(.*(Reader|Writer)).*(\[.*\])/\1\n\3/' file) )
$ IFS="$oIFS"
$ echo "${arr[0]}"
10/11/12 05:34:34 Writer
$ echo "${arr[1]}"
[Avg. 12 write issues found]

修改

没有-r

sed 's/^\(.*\(Reader\|Writer\)\).*\(\[.*\]\)/\1\n\3/' file

答案 1 :(得分:0)

您可以找到这两种模式并将它们一起打印而不使用-r值,如下所示

sed 's#\([0-9]\{2\}.*:[0-9]\{2\} \S*\).*\(\[.*\]\)#\1 \2#g'

结果

10/11/12 05:34:34 Writer [Avg. 12 write issues found]

匹配 Writer 读者,而不使用-d选项和sed

sed -e 's#\([0-9]\{2\}.*:[0-9]\{2\} Writer\).*\(\[.*\]\)#\1 \2#g' -e 's#\([0-9]\{2\}.*:[0-9]\{2\} Reader\).*\(\[.*\]\)#\1 \2#g' my_file