Eu tenho uma matriz de strings chamada names
contendo nomes com alguns dados de lixo subsequentes. Assim
Jill Shortz, City Contractor, America
Bill Torts, Family Doctor, Canada
Will Courtz, Folk DJ, Bulgaria
Phil-Lip Warts, Juggler, India
Eu quero iterar names
extraindo apenas as duas primeiras palavras com o regex (^\w+-*( *\w+)*)
e substituindo-as de volta para names
que ele contenha
Jill Shortz
Bill Torts
Will Courtz
Phil-Lip Warts
foi assim que tentei, mas minha máquina AIX não gosta do -P
argumento para executar no modo Perl
for((i=0;i<${#names[@]};++i)); do
names[$i]=`grep -P '(^\w+-*( *\w+)*)' -o <<<"${names[i]}"`
done
Eu realmente não vejo um uso para expressões regulares para concluir esta tarefa, supondo que você queira remover tudo após a primeira vírgula.
Isso remove a primeira vírgula e tudo depois dela de cada elemento da matriz individualmente (literalmente "o sufixo mais longo que corresponde ao padrão globbing
,*
"). A lista resultante de nomes modificados é então reatribuída ànames
matriz (e impressa comprintf
).O código, dada sua inicialização inicial do array para a lista na pergunta, geraria
(as aspas duplas são adicionadas pela
printf
string de formato).O código funcionaria com
ksh93
,bash
,zsh
eyash
.Eu não vejo em nenhum lugar na página de manual do ksh que você possa combinar uma string com uma expressão regular e usar parênteses de captura para extrair substrings (como você faria no bash com
No entanto, você pode usar expressões regulares estendidas em padrões glob com
~(E:regex)
, então você pode fazer isso:... e para máxima ilegibilidade somente para gravação