我对bash很新,所以这是一个非常棒的问题..
假设我有一个字符串:
string1 [string2] string3 string4
我想从方括号中提取string2
;但是括号可能在任何其他时间围绕任何其他字符串。
我如何使用sed
等来执行此操作?谢谢!
答案 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