2010-11-14 20 views
3

我有一个字符串是这样的:Unix的剪切操作

uid=2560(jdihenia) gid=1000(undergrad) 

我只想得到undergrad部分中的变量名VAR1。所以我用一个命令

var1=`echo "uid=2560(jdihenia) gid=1000(undergrad)" | cut -d "(" -f 3` 

但这将中VAR1赋值undergrad)。你能告诉我怎样才能得到undergrad部分的变量var1?

+1

小心与那些back ticks。我建议你使用'$()'来代替。 – ocodo 2010-11-14 23:12:12

回答

3

如果你想在括号中的文字文本 “本科生”,这应该工作:

cut -d "(" -f 2 <text> | cut -d ")" -f 1 

或等价

echo <text> | cut -d "(" -f 2 | cut -d ")" -f 1 
+0

感谢您的所有答案。 var1 ='echo | cut -d“(”-f 3 | cut -d“)”-f 1“运行良好。 – 2010-11-14 23:27:22

3

如果此字符串来自id,那么您可以改为拨打id -gn

2
var1="uid=2560(jdihenia) gid=1000(undergrad)" 
var1=${var1#*\(*\(} 
var1=${var1%%\)*} 
+0

较短:'var1 = $ {var1 ## * \(}'和'var1 = $ {var1%)*}'。 – 2010-11-15 05:36:06

+0

@丹尼斯,POSIX标准,ksh(ksh93和mksh;括号是扩展模式匹配符号的一部分)需要转义括号,如果'shopt -s extglob'有效,则使用bash。它似乎可以在大多数其他炮弹中使用。 – jilles 2010-11-15 23:33:39

+0

至少在这些情况下,我没有发现任何不良影响,在Bash中使用'extglob'。 – 2010-11-15 23:46:33

2

echo "$str" | awk -F'[()]' '{print $4}'

1
var1=$(echo "uid=2560(jdihenia) gid=1000(undergrad)" | grep -Po 'gid=.*\(\K.*(?=\))')