正在尝试从bash中的字符串中检索前5个字符(仅数字和字母)

正在尝试从bash中的字符串中检索前5个字符(仅数字和字母),bash,shell,Bash,Shell,我有一根这样的绳子 1-a-bc-dxyz 我想得到1-a-bc-d(前5个字符,只有数字和字母) 谢谢你呆呆地看着我: awk '{ for ( i=1;i<=length($0);i++) { if ( match(substr($0,i,1),/[[:alnum:]]/)) { cnt++;if ( cnt==5) { print substr($0,1,i) } } } }' <<< "1-a-bc-dxyz" a='1-a-bc-dxyz' 计数=0 对

我有一根这样的绳子

1-a-bc-dxyz


我想得到
1-a-bc-d
(前5个字符,只有数字和字母)

谢谢你呆呆地看着我:

   awk '{ for ( i=1;i<=length($0);i++) { if ( match(substr($0,i,1),/[[:alnum:]]/)) { cnt++;if ( cnt==5) { print substr($0,1,i) } } } }' <<< "1-a-bc-dxyz"
a='1-a-bc-dxyz'
计数=0
对于((i=0;i使用GNU awk:

$ echo 1-a-bc-dxyz | \
awk -F '' '{b=i="";while(gsub(/[0-9a-z]/,"&",b)<5)b=b $(++i);print b}' 
1-a-bc-d
$echo 1-a-bc-dxyz |\

awk-F''{b=i=“”;而(gsub(/[0-9a-z]/,“&”,b)使用sed和awk的组合

echo 1-a-bc-dxyz|sed的//-*%$#@///g'| awk-F'{'print$1$2$3$4$5'}


您也可以使用for循环打印字符。

GNU
sed
支持替换第k个匹配项以及之后的所有匹配项

echo "1-a-bc-dxyz" | sed 's/[^a-zA-Z0-9]*[a-zA-Z0-9]//g6'
这很简单。

既不是sed也不是awk。

我想得到
1-a-bc-d
,而不是
1abcd
awk是作为一行程序来完成这项工作的唯一方法。答案很好!@nitinr708不是唯一的一行程序,
sed
更短(见我的答案)。通常在否决投票时进行评论。噢,每个人都被否决了。几乎.OP也希望看到分隔符,不是
1abcd
,而是
1-a-bc-d
。这是一个很好的解决方案,但是
1-a-bc-d-xyz
(输出中的额外
-
)失败于
-a-bc-d-xyz
(短输出一个字母)那么就更具体一点。你的方法使用echo“1-a-bc-d-xyz”| grep-Eo'([^[:alnum:]*[:alnum:]]){5}'
。这取决于任务。你想用输入
1-a#bc%d做什么(xyz
?或者
-
是唯一的特殊字符吗?显然,几乎所有人都是。我会补偿的,这很好。我同意,这是最简单的答案。我尊敬您@Walter a
a='1-a-bc-dxyz'
count=0
for ((i=0;i<${#a};i++)); do [[ "${a:$i:1}" =~ [0-9]|[a-Z] ]] && [[ $((++count)) -eq 5 ]] && echo "${a:0:$((i+1))}"; done
$ echo 1-a-bc-dxyz | \
awk -F '' '{b=i="";while(gsub(/[0-9a-z]/,"&",b)<5)b=b $(++i);print b}' 
1-a-bc-d
awk -F '' '{                        # separate each char to its own field
    b=i=""                          # if you have more than one record to process
    while(gsub(/[0-9a-z]/,"&",b)<5) # using gsub for counting (adjust regex if needed)
        b=b $(++i)                  # gather buffer
    print b                         # print buffer
}'
echo "1-a-bc-dxyz" | sed 's/[^a-zA-Z0-9]*[a-zA-Z0-9]//g6'
echo '1-a-bc-dxyz' | grep -Eo '^[[:print:]](-*[[:print:]]){4}'