在Unix中的变量中提取两个字符串之间的部分

时间:2015-07-28 06:44:04

标签: bash unix

我有一个字符串,

tester_one="update set_tables set abc=7 where bcd=9"

这里我只想提取“set”和“where”之间的部分,

abc=7

我尝试了几个Unix命令,但是在我希望它接收的部分之前,它发现了 set 或遇到的任何地方。

我知道如何使用Java但我在Unix中迷失了,因为我是新手。

5 个答案:

答案 0 :(得分:3)

使用sed

$ echo "$tester_one" | sed -E 's/.*set (.*) where.*/\1/'
abc=7

要在变量中捕获它:

$ new=$(echo "$tester_one" | sed -E 's/.*set (.*) where.*/\1/')
$ echo $new
abc=7

使用awk

$ echo "$tester_one" | awk '{sub(/.*set /,""); sub(/ where.*/,""); print;}'
abc=7

使用grep -P

如果你的grep支持-P(perl-like)选项:

$ echo "$tester_one" | grep -oP '(?<=set ).*(?= where)'
abc=7 

答案 1 :(得分:1)

你可以用sed把它拿出来。类似的东西:

echo "$tester_one" | sed 's/.* set \(.*\) where .*/\1/'

答案 2 :(得分:1)

使用Bash Pattern Matching

#!/bin/bash
tester_one="update set_tables set abc=7 where bcd=9"
pat=".* set (.*) where"
[[ $tester_one =~ $pat ]]
echo "${BASH_REMATCH[1]}"

答案 3 :(得分:1)

您还可以使用setwhere作为字段分隔符,并打印位于它们之间的字段:

$ awk -F"set | where" '{print $2}' <<< "update set_tables set abc=7 where bcd=9"
abc=7

答案 4 :(得分:0)

your other question一样,这可以在纯bash中实现,而无需使用sed / awk / grep等外部工具。

#!/usr/bin/env bash

tester_one="update set_tables set abc=7 where bcd=9"

output="${tester_one#* set }"
output="${output% where }"

echo "$output"

注意&#34; set&#34;周围的空格。和&#34;其中&#34;在参数扩展行中。正如您所料,如果$tester_one变量包含不同的&#34; set&#34;,那么您需要小心这一点。或&#34;其中&#34;在你不期望的地方。

那就是说,我更喜欢Jahid's answer。 : - )