从括号中提取字符串

时间:2011-08-26 19:28:58

标签: bash sed

我对bash很新,所以这是一个非常棒的问题..

假设我有一个字符串:

string1 [string2] string3 string4

我想从方括号中提取string2;但是括号可能在任何其他时间围绕任何其他字符串。

我如何使用sed等来执行此操作?谢谢!

9 个答案:

答案 0 :(得分:58)

试试这个:

echo $str | cut -d "[" -f2 | cut -d "]" -f1

答案 1 :(得分:51)

这是使用awk的一种方式:

echo "string1 [string2] string3 string4" | awk -F'[][]' '{print $2}'

此sed选项也有效:

echo "string1 [string2] string3 string4" | sed 's/.*\[\([^]]*\)\].*/\1/g'

以下是sed命令的细分:

s/          <-- this means it should perform a substitution
.*          <-- this means match zero or more characters
\[          <-- this means match a literal [ character
\(          <-- this starts saving the pattern for later use
[^]]*       <-- this means match any character that is not a [ character
                the outer [ and ] signify that this is a character class
                having the ^ character as the first character in the class means "not"
\)          <-- this closes the saving of the pattern match for later use
\]          <-- this means match a literal ] character
.*          <-- this means match zero or more characters
/\1         <-- this means replace everything matched with the first saved pattern
                (the match between "\(" and "\)" )
/g          <-- this means the substitution is global (all occurrences on the line)

答案 2 :(得分:17)

纯粹的bash:

STR="string1 [string2] string3 string4"
STR=${STR#*[}
STR=${STR%]*}
echo $STR

答案 3 :(得分:14)

这是另一个,但它会处理多次事件,例如

$ echo "string1 [string2] string3 [string4 string5]" | awk -vRS="]" -vFS="[" '{print $2}'
string2
string4 string5

简单的逻辑就是这个,你拆分“]”并通过拆分词找到“[”,然后拆分“[”得到第一个字段。在Python中

for item in "string1 [string2] string3 [string4 string5]".split("]"):
    if "[" in item:
       print item.split("]")[-1]

答案 4 :(得分:7)

使用 -F'[分隔符]'

指定awk多个分隔符

如果分隔符是方括号,请将它们背靠背放置,如] [

awk -F '[][]' '{print $2}'

否则你将不得不逃避它们

awk -F '[\\[\\]]' '{print $2}'

获取括号之间的值的其他示例:

echo "string1 (string2) string3" | awk -F '[()]' '{print $2}'
echo "string1 {string2} string3" | awk -F '[{}]' '{print $2}'

答案 5 :(得分:1)

这是一个awk示例,但我在括号上匹配,这也使得-F的工作方式更加明显。

  

echo'test(lskdjf)'| awk -F'[()]''{print $ 2}'

答案 6 :(得分:0)

内联解决方案可以是:

a="first \"Foo1\" and second \"Foo2\""
echo ${a#*\"} | { read b; echo ${b%%\"*}; }

您可以单行测试:

a="first \"Foo1\" and second \"Foo2\""; echo ${a#*\"} | { read b; echo ${b%%\"*}; }

输出:Foo1

括号示例:

a="first [Foo1] and second [Foo2]"
echo ${a#*[} | { read b; echo ${b%%]*}; }

在一行中:

a="first [Foo1] and second [Foo2]"; echo ${a#*[} | { read b; echo ${b%%]*}; }

输出:Foo1

答案 7 :(得分:0)

Read file in which the delimiter is square brackets:
$ cat file
123;abc[202];124
125;abc[203];124
127;abc[204];124

To print the value present within the brackets:
$ awk -F '[][]' '{print $2}' file
202
203
204

乍一看,上述命令中使用的分隔符可能会令人困惑。这很简单。在这种情况下将使用2个分隔符:一个是[和另一个]。由于分隔符本身是方括号,它放在方括号内,所以在第一次看起来很棘手。

注意:如果方括号是分隔符,则应仅以这种方式放置,意思是第一个]后跟[。使用像-F'[[]]这样的分隔符将完全给出不同的解释。

请参阅此链接:http://www.theunixschool.com/2012/07/awk-10-examples-to-read-files-with.html

答案 8 :(得分:0)

另一个awk

$ echo "string1 [string2] string3 [string4]" |
awk -v RS=[ -v FS=] 'NR>1{print $1}' 
string2
string4