在字符串之间提取文本

时间:2010-08-19 21:39:22

标签: sed awk grep

如何从充满这些行的文件中提取具有非常特定模式的字符串之间的文本?例如:

input:a_log.gz:make=BMW&year=2000&owner=Peter

我想基本上捕获部分make=BMW&year=2000。我知道这条线可以从“输入:(任意数量的字符).gz:”结束,并以“owner = Peter”结尾

5 个答案:

答案 0 :(得分:0)

使用正则表达式:input:.*?\.gz:(.*?)&?owner=Peter。捕获将包含第二个冒号和“所有者=彼得”之间的东西,修剪符号。

答案 1 :(得分:0)

尝试一下:

sed -n 's/.*:\([^&]*&[^&]*\)&.*/\1/p' file

这将提取第二个冒号和第二个&符号之间的所有内容,无论之前和之后是什么(如果有更多的冒号或符号,它可能无法正常工作)。

答案 2 :(得分:0)

你可以使用shell(bash / ksh)

$ s="input:a_log.gz:make=BMW&year=2000&owner=Peter"
$ s=${s##*gz:}
$ echo ${s%%owner=Peter*}
make=BMW&year=2000&

如果你想要sed

$ echo ${s} | sed 's/input.*gz://;s/owner=Peter//'
make=BMW&year=2000&

答案 3 :(得分:0)

>echo "input:a_log.gz:make=BMW&year=2000&owner=Peter"|sed -e "s/input:.*.gz://g" -e "s/&owner.*//g"
make=BMW&year=2000

答案 4 :(得分:0)

我没有看到使用awk的答案:

awk '{ match($0, /input:.*\.gz:/);
       m = RSTART+RLENGTH;
       n = index($0, "&owner=Peter") - m;
       print substr($0,m,n)
     }'

该方法是sh版本(参数扩展的子字符串)和sed(正则表达式)版本之间的混合。这是因为awk RE缺乏反向引用。