Вы можете удалить ненужные символы с помощью${var//pattern/replacement}
:
s='-w o rd'
s=${s//[- ]}
А затем используйте расширение подстроки для выбора одного символа за раз:
$ for ((i=0; i < ${#s}; i++)); do
echo ${s:i:1}; # or do whatever you like here
done
(похоже, он работает даже с многобайтовыми -символами, по крайней мере, в моей системе.)
Обратите внимание, что IFS='\0- '
будет назначать буквальную обратную косую черту для IFS
, поскольку обратная косая черта не имеет особого значения в одинарных кавычках. Восьмеричный escape будет работать внутри $'...'
, но переменные в Bash не могут содержать байт NUL, так что это не помогает. (Строка обрезается на NUL, т.е. x=$'foo\0bar'; printf "%q\n" "$x"
печатает только foo
. Кроме того, как сказал @muru, разделение на байт NUL — это не то же самое, что разделение между каждым символом)
$ cat tst.awk
BEGIN { wid = 30 }
sub(/^>/,"") { hdr=$1; next }
NR == FNR { a[hdr]=$0; next }
{
for ( hdrA in a ) {
strA = a[hdrA]
lgthA = length(strA)
for ( idxA=1; idxA<=(lgthA - wid + 1); idxA++ ) {
substrA = substr(strA,idxA,wid)
if ( index($0, substrA) ) {
printf "[%s,%s]\n", hdrA, hdr
break
}
}
}
}
$ awk -f tst.awk file1 file2
[1,1]
[1,2]