我需要提取 GEDCOM 文件中选定行的第二个字段。这些行都是以下格式:
% grep @ /tmp/XYZ | tail -5
0 @X701@ OBJE
0 @X702@ OBJE
0 @X750@ OBJE
0 @X765@ OBJE
0 @X766@ OBJE
但接下来,
% egrep "0 \@[^@]\@" /tmp/XYZ
% perl -CSD -p -i -e 's:0 @([^@])@ .*:ZYX \1:g;' /tmp/XYZ
第一个什么也没找到,第二个什么也没改变;我不明白为什么。
这CSD
是因为虽然该文件大部分是 ASCII,但它包含一些法语、波兰语和中文,并且是 UTF-8 编码的。
据我所知,@
不是正则表达式的特殊字符。
更新:我正在寻找具有主键功能的字段。它始终由 分隔@
,因此不能包含@
. 有些行可能会引用这样的键,但它仅在行以 开头时才是主要的0
。我不能匹配包含 other@
但应该通过放入 string-begin 来确保的行^
。我也不能点击其他格式的行——我使用 grep 显示目标行的格式,并使用 tail 将大小限制为小于 5000。
^
;开头您的正则表达式 例如,^0 @…
。[^@]
将匹配X
或7
。要匹配两个字符之间的任意数量的非@
字符(例如, ) ,您需要or ; 例如,X701
@
[^@]*
[^@]+
如果+
您必须在@
两个字符之间至少有一个非字符,请使用此@
选项。\@
除非平原@
失败,否则不要使用。@
,请使用另一个[^@]*
来指定该行的其余部分是 . 以外的字符@
。