我有一个像这样的字符串
1-A-BC-DXYZ
我想获得1-a-bc-d
(前5个字符,只有数字和字母)
由于
答案 0 :(得分:4)
gawk:
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"
逐个读取每个字符,然后如果字母数字字符的模式匹配(使用匹配函数),则递增变量cnt。当cnt变为5时,打印到目前为止我们看到的字符串(使用substr函数)
输出:
1-a-bc-d
答案 1 :(得分:1)
a='1-a-bc-dxyz'
count=0
for ((i=0;i<${#a};i++)); do
if [[ "${a:$i:1}" =~ [0-9]|[a-Z] ]] && [[ $((++count)) -eq 5 ]]; then
echo "${a:0:$((i+1))}"
exit
fi
done
您可以进一步缩小为;
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
答案 2 :(得分:1)
使用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
说明:
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
}'
答案 3 :(得分:1)
GNU sed
支持替换第k个匹配项的选项以及之后的所有匹配项。
echo "1-a-bc-dxyz" | sed 's/[^a-zA-Z0-9]*[a-zA-Z0-9]//g6'
答案 4 :(得分:0)
使用sed&amp;组合AWK
echo 1-a-bc-dxyz | sed 's/[-*%$#@]//g' | awk -F '' {'print $1$2$3$4$5'}
您也可以使用for循环打印字符。
答案 5 :(得分:0)
echo '1-a-bc-dxyz' | grep -Eo '^[[:print:]](-*[[:print:]]){4}'
这很简单 既不是sed也不是awk。