拆分具有两种模式的字符串

时间:2015-08-06 09:16:40

标签: linux bash awk

我有一个字符串id=12345&data=23456
我想打印12345 23456
目前我只知道如何用awk

分别拆分其中一个
echo id=12345&data=23456 | awk -F"id=" '{print substr($2,1,5)}'

和数据类似。
如何组合这些awk命令以获得所需的结果?

6 个答案:

答案 0 :(得分:1)

正则表达式组可以是一个解决方案,但awk无法处理正则表达式组,但是,gawk可以。

示例

echo "id=12345&data=23456" | gawk 'match($0, /^id=([^&]*)&data=(.*)$/, groups) {print groups[1] " " groups[2]}'

<强>输出

12345 23456

答案 1 :(得分:1)

不需要外部流程。您可以使用内置read来提取两个数字:

$ IFS="=&" read _ num1 _ num2 <<< "id=12345&data=23456"
$ printf "%s\n" "$num1" "$num2"
12345
23456

答案 2 :(得分:0)

使用awk

echo "id=12345&data=23456" | awk -F[\&=] '{ print $2,$4}'

greptr

echo "id=12345&data=23456" | grep -o '[0-9]\+' | tr  '\n' ' '

注意:上面的命令会在最后添加一个空格。

答案 3 :(得分:0)

看起来像我的查询字符串...我建议解析它。例如,使用PHP:

echo "id=12345&data=23456" | php -r 'parse_str(fgets(STDIN), $query); print_r($query);'

这给出了输出:

Array
(
    [id] => 12345
    [data] => 23456
)

因此,要获得您想要的输出,您可以选择:

$ echo "id=12345&data=23456" | php -r 'parse_str(fgets(STDIN), $query); echo $query["id"] . " " . $query["data"];'
12345 23456

对于快速而又脏的替代方案,您可以使用sed:

$ echo "id=12345&data=23456" | sed -r 's/id=([^&]+)&data=([^&]+)/\1 \2/'
12345 23456

这会捕获id=后的&部分以及&data=后的部分直到下一个&(如果有的话)。这种方法的缺点是,如果查询字符串的两个部分的顺序相反,它会中断,但它可能对你的用例来说已经足够了。

答案 4 :(得分:0)

替代代码

echo "id=12345&data=23456" | tr -s '&' '\n' | cut -d '=' -f 2 | tr -s '\n' ''

答案 5 :(得分:0)

根据您要对输出做的事情,其中​​一个可能就是您所需要的:

$ echo 'id=12345&data=23456' | tr -c -s '[0-9]' ' '
 12345 23456 $

$ echo 'id=12345&data=23456' | tr -s '[a-z=&]' ' '
 12345 23456
$