我有一个bash脚本,它将接收一个如下所示的字符串:
foo,user:johndoe,bar
值的顺序和数量未知,因此它也可能是:
bar,foo,baz,user:johndoe
我需要能够获取用户名 - 在本例中为johndoe
。
使用grep,我得到的最接近的是:
$ echo "foo,user:johndoe,bar" | grep -o 'user:.*,'
user:johndoe,
但这也让我user:
和,
,这是我不想要的。我是新手,并且不确定grep是否是我应该使用的工具,或者awk或者更合适的东西。
答案 0 :(得分:3)
对于简单的替换,sed将会:
% echo "foo,user:johndoe,bar" | sed 's/.*user:\([^,]*\).*/\1/'
johndoe
以上内容将用您的用户替换整个字符串:
s/
.* # Match anything zero or more times
user: # Match literal user:
\([^,]*\) # Capture everything but , zero or more times in \1
.* # Match to the end of the string
/\1/ # Replace with what we matched and saved in \1
GNU Grep还有一个-P
选项,可以支持lookbehinds的PCRE:
% echo "foo,user:johndoe,bar" | grep -Po '(?<=user:)[^,]*'
johndoe
-P
仍然具有很高的实验性,应尽可能避免使用。
答案 1 :(得分:2)
使用awk:
$ echo "foo,user:johndoe,bar" | awk -F: '$1=="user"{print $2}' RS=,
johndoe
-F:
这会将字段分隔符设置为:
$1=="user"{print $2}
如果第一个字段为user
,则打印第二个字段。
RS=,
这会将记录分隔符设置为,
。
答案 2 :(得分:0)
echo "foo,user:johndoe,bar" | awk -F ":" '{print $2}' | awk -F "," '{print $1}'