Preciso extrair o segundo campo de linhas selecionadas em um arquivo GEDCOM. Essas linhas são todas do seguinte formato:
% grep @ /tmp/XYZ | tail -5
0 @X701@ OBJE
0 @X702@ OBJE
0 @X750@ OBJE
0 @X765@ OBJE
0 @X766@ OBJE
Mas a seguir,
% egrep "0 \@[^@]\@" /tmp/XYZ
% perl -CSD -p -i -e 's:0 @([^@])@ .*:ZYX \1:g;' /tmp/XYZ
o primeiro não encontra nada e o segundo não muda nada; Eu não entendo por quê.
Isso ocorre porque, embora o CSD
arquivo seja principalmente ASCII, ele contém um pouco de francês, polonês e chinês e é codificado em UTF-8.
Tanto quanto sei, @
não é um caractere especial para expressões regulares.
Update : Estou procurando o campo que tem a função de chave primária. É sempre delimitado por @
e, portanto, não pode conter um @
. Algumas linhas podem fazer referência a essa chave, mas só é primária quando a linha começa com 0
. Não devo corresponder linhas que contenham outras, @
mas isso deve ser garantido colocando um string-begin ^
. Também não devo acertar em linhas de outros formatos - usei grep para mostrar o formato das linhas de destino e tail para limitar o tamanho a menos de cinco mil.
^
; por exemplo,^0 @…
.[^@]
corresponderáX
ou7
. Para corresponder qualquer número de não@
caracteres (por exemplo,X701
) entre os dois@
caracteres, você precisa de[^@]*
ou[^@]+
; por exemplo, Use+
se você precisar ter pelo menos um não@
caractere entre os dois@
caracteres. Não use a menos que a falha\@
simples .@
@
, use outro[^@]*
para especificar que o restante da linha é de caracteres diferentes de@
.