使用 getent passwd 获取用户身份的输出。
我怎样才能改变输出
u12345:John Doe
到
u12345,jdoe
我用 sed 得到它,但它删除了 u12345 但确实给了我 jdoe
答案1
对于awk
,假设:
和空格可以可靠地用作字段分隔符:
$ echo 'u12345:John Doe' | awk -F'[: ]' '{print $1 "," tolower(substr($2, 1, 1) $3)}'
u12345,jdoe
答案2
和Perl
:
perl -lne 'print "$1," . lc $2 . $3 if /^([^:]+):(\w)\S+\s+(\S+)/' file
u12345,jdoe
答案3
使用 GNU sed
:
sed -nE 's/^([^:]*):([^:[:space:]])[^[:space:]]*[[:space:]]+([^:[:space:]]+).*$/\1,\L\2\3/p'
或者使用perl
:
perl -C -F: -lae 'print "$F[0]," . lc("$1$2") if $F[1] =~ /^(\S)\S*\s+(\S+)/'
答案4
使用乐(以前称为 Perl_6)
~$ raku -ne 'put "$0,{($1,$2).join.lc}" if m/^ (<-[:]>+) \: (\S) \S* \s (\S+)/;' <<< 'u12345:John Doe'
示例输出:
u12345,jdoe
Raku 是 Perl 家族的一种编程语言。上面,Raku 代码是使用-ne
非自动打印逐行标志运行的。正则表达式匹配器m/ ... /
用于识别感兴趣的行。如果 ( if
) 存在匹配,则用( ... )
括号捕获的零索引组将被排除put
。大括号表示 Raku 代码在 (tojoin
和lc
小写字母)内运行。
捕获$0
包含从行开头开始的字符不要包含一个:
冒号。换句话说,两个连续的正则表达式原子<-[:]> \:
意味着“创建一个不包含冒号的自定义字符类,并查找一个或多个此类字符,后跟\:
冒号。”
正则表达式原子的(\S) \S+ \s (\S+)
意思是_“将\S
非空白字符捕获到$1
(即名字首字母);识别一个或多个非空白字符后跟\s
空白,然后将后面的(\S+)
一个或多个非空白字符捕获到$2
(即请注意,这里仅处理单一名字(或初始)名字和单一姓氏的最简单情况。
注意:上面的代码消除了不匹配的行。如果要保留不匹配的行,请使用以下代码:
~$ raku -ne 'if m/^ (<-[:]>+) \: (\S) \S* \s (\S+)/ {put "$0,{($1,$2).join.lc}"} else {put $_};' file
#OR
~$ raku -ne 'm/^ (<-[:]>+) \: (\S) \S* \s (\S+)/ ?? put "$0,{($1,$2).join.lc}" !! put $_;' file
如果不匹配,则逐字显示上面的put $_
行(该行存储在$_
Perl/Raku 的“主题变量”中)。如果您想清空这些行,请使用"".put
或put ""
。