Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Guido Socher
�@��²���G �]�� Linux �O�ӦۥѶ}�񪺨t�ΡA �ӳ߷R�W���A �P�ɯ�P�M�G�@�ɪ� Linux �P�n�@�_�@�ơA �]�W�K���֪��ֽ�C �Ŷ����l�A �L�|�����k�͡A ťť BBC ���y�A�ȵL�u�q�x���s���A ��m���M�ۦ樮�A �H�Ψɨ��� Linux ���ֽ�C

�P�@�̳sô


���e�ؿ��G
����
�@��²�檺�Ҥl
�y�k�W�h
���Υ��W�B�⦡����O�ӽs���r

���W�B�⦡

[Illustration]

���e�K�n�G ���W�B�⦡ (regular expression) �Q���Ω󥻤�j�M�A �Τ�y�ק諸�i�����X�W�C �z�i�H�b�\�h�i�����s�边�B �y�k���R�{���B �H�ε{���y�����A �o�{�L�̪��ܼv�C




����

�\�h�i�����s�边�A ���O vi �M emacs�A �u��{�� grep/egrep�A �H�ε{���y�� �A ���O awk�B perl �M sed�A ���i�H�o�{���W�B�⦡���ܼv�C

���W���ܦ��Q���Ω󥻤�j�M�A �Τ�y�ק諸�i�����X�W�C ���W�B�⦡�N�O�Y�ؼ˦�����y�z�A �z�L�Ӽ˦��A �i�H����峹�����@�q��r�C

�O�o�h�~�H�e�A �ݨ�Y�H�b�ϥΥ��W�B�⦡�A �ڷ��ɤj�P���_�C �q�`�n��O�Ƥp�ɪ��ɶ��A �~�৹���峹�s��H�ηj�M���u�@�A �~�M�i�H�b�X�����N�����ѨM�C ���O�A ���ڪ`���ù����B�⦡�ɡA �o�s�@�Ӧr�]�ݤ����A ���̬ݰ_�ӹ��O�@���I�B �׽u�B �P���A �H�Ψ�L�r���A �Ҵ�_�Ӫ��_�DzզX�C ���M�p���A �ڤ��¤U�w�M�ߡA �n�h��ѥ����u�@��z�A �ܧ֦a�A �ڵo�{���̨��O�D�`�e���ϥΪ��A ���@�ǰ򥻪��W�h�i�`�C

���M���W�B�⦡�b Unix ���@�ɤ��A �B�Φa�۷��s�x�A ���O�٥��X�{�L�A �ҿת��u�зǥ��W�B�⦡�v�A �������p�A �ܹ��O���\�h���P���訥�s�b�@��C �Ҧp���G�� grep �{���G grep �P egrep�A ���̳����ϥΥ��W�B�⦡�A �u�O��O�y�L���P�Ӥw�C �ӵ{���y�� Perl �����W�B�⦡�A �\��i���O�̧��㪺�F�C �i�ߪ��O�A �L�̳����`�ۦP����h�A �@���z��Ѱ��[����A �A�h�Dzߨ�L�訥���ӷL�t���B�A �O�ܮe�����C

����N���U�줶�Ф@�ǰ򥻪��[���A �P�ɱz�]�i�H�d�ݤ��P�{�����ާ@�������A �H�K��Ѩ�۲����B�A �H�Υ\��Ҧb�C

�@��²�檺�Ҥl

Ĵ�p���A �z���@�����q���u���q�ܦW��A ���ݰ_�ӹ��O�o�ˡG

Phone Name  ID
     ...
     ...
3412    Bob 123
3834  Jonny 333
1248   Kate 634
1423   Tony 567
2567  Peter 435
3567  Alice 535
1548  Kerry 534
     ...

�o�O�@�� 500 �H�����q�A �L�̧���u��ƥH�@�몺�¤�r�ɮץ[�H�x�s�C �q�ܸ��X���A �Ĥ@��Ʀr�� 1 ���H�A ���ܥL�b 1 ���j�H�u�@�C ����쩳�֦b 1 ���j�H�u�@�O?

���W�B�⦡�i�H�^���o�Ӱ��D�G
grep '^1' phonelist.txt

��
egrep '^1' phonelist.txt

��
perl -ne 'print if (/^1/)' phonelist.txt

�����N��O���A �j�M�ɮת��C�@��A �ݬݬO�_���H 1 �@�Ӧ�}�Y���C �Ÿ� "^" ���ܭn���C�@�檺�}�Y�A ���j���ӥ��W�B�⦡�A �u���ǰt��A �H 1 �@�Ĥ@�Ӧr�����C�@��C

�y�k�W�h

��@�r���˦�

���W�B�⦡���򥻺c��A �N�O��@�r���˦��A ���u���ǰt�o�Ӧr���C �e�����Ҥl���A 1 �N�O�ӳ�@�r���˦��A �o�u���ǰt�峹���A 1 �o�Ӧr���C

�t�@�ӳ�@�r���˦�����ҬO�G
egrep 'Kerry' phonelist.txt

�o�Ӥ��˦��A ����٬O�ȥѳ�@�r���˦��Ҳզ� (�r�� K,e ...)

�ƭӦr���i�H�E���_�ӡA ��b�r�����X���A �o�˪����X�A �O�Ѥ@�索�B �k��A���A �H�Φb�o���A���������@��r���A �Ӱ������ܡC ��Ӧr�����X�A ���]�Q������@�r���˦��A �b�i��˦����ɡA �o�Ǧr�����X�̡A �|���@�ӡA �ӥB�u���@�Ӧr���A �X�{�b�ҷj�M�ǰt����y���C �Ҧp�G

[abc]    �O�ӳ�@�r���˦��A �ΨӤ��ǰt�峹��
	 a�B b �� c ���������@�Ӧr��
[ab0-9]  �O�ӳ�@�r���˦��A �ΨӤ��ǰt�峹��
	 a �� b �Τ@�� ascii �r�������A
	 �d��b 0 �� 9 ���Ʀr
[a-zA-Z0-9\-] �ΨӤ��ǰt�Y�ӳ�@�r���� 
	      �j�g�Τp�g�r���B ���ԧB�Ʀr�δ

���ڭ̸յ۰���G
egrep '^1[348]' phonelist.txt

�o�˷|�j�M��H 13 �� 14 �� 18 �}�Y���C�@��C

�p�ڭ̩Ҭݨ쪺�A �j������ ASCII �r���A �N�O���Ө�r���쥻���ˤl�Ӥ��A ���O���� ASCII �r���A �o���S�����t�N�C �Ҧp��A���A ���ܶ}�l���w�@�Ӧr�����X�A �b�r�����X���A "-" ���S���t�N�N�O�u�d��v�C �n�����S�w�r�����S���t�N�A �z�i�H�b�Ӧr���e���A �[�W�ϱ׽u�r���C �b [a-zA-Z0-9\-] ������A �N�O�@�ӹ�ҡC �]���Y�ǥ��W�B�⦡���u�訥�v�A �b�S�w�r���e���[�W�ϱ׽u�r����A �|���S���t�N�A ���ɡA �A�o�N�e�����ϱ׽u�r�������A �~���쥻���`���N��C

�I�r�� (.) �O�@�ӭ��n���S���r���A ���F����r���~�A ���|���ǰt�����@�Ӧr���C �Ҧp�G

grep '^.2' phonelist.txt

 �� 

egrep '^.2' phonelist.txt

�o�˷|�j�M�ǰt��A �Ĥ@�Ӧr��������r���A �ӥB�ĤG�Ӧr���� 2 ���C�@��C

�p�G�ϥ� "[^" �Ӥ��O "[" �өw�q�r�����X�A �h��ҥN�����t�N�A �P��ӧ����ۤϡC �b "[" �P "^" �զX����A "^" ���N�q���A�O�N���C�檺�}�Y�A �ӬO�N���r�����X���ϸq�C

[0-9]    �O�ӳ�@�r���˦��A �|���ǰt��峹��
         �@�� ascii �r�������A �d��b 0 �� 9 ���Ʀr
[^0-9]   �|���ǰt�����@�ӫD���ԧB�Ʀr���r��
[^abc]   �|���ǰt�����@�ӫD a�B b �� c ���r��
 .       �I�r���|���ǰt�����@�ӫD����r�����r��
         �����N�q�P [^\n] �ۦP�A �䤤 \n �O����r��

�n���ǰt��u���O�H 1 �}�Y���C�@���r�v�A �ڭ̥i�H�o�˼g�G

grep '^[^1]' phonelist.txt

��

egrep '^[^1]' phonelist.txt

�w��r��

�b�e���������A �ڭ̤w�g���D "^" �O�ΨӤ��ǰt��峹���C�@��}�Y�C �w��r���O�@�دS�O�����W�B�⦡�r���A ���Q�ΨӤ��ǰt��峹���Y�Ӧ�m�A �Ӥ��O�峹���Ҧ��r���C

^  �|���ǰt�峹�̪��C�@��}�Y
$  �|���ǰt�峹�̪��C�@�浲��

�Q�n�b���q�����u�q�ܦW�椤�A �M�� ID �s���� 567 ���H�A �ڭ̥i�H�o�˰��G

egrep '567$' phonelist.txt

�o�ˤl�|�M���u�H�Ʀr 567 �����v���C�@��C

���Ʀr��

���Ʀr���ΨӨM�w�A ��@�r���˦��b�峹�������X�{�X���C

���� grep egrep perl vi vim vile elvis emacs
�s�Φh�� * * * * * * * *
�@�Φh�� \{1,\} + +   \+ \+ \+ +
�s�Τ@�� \? ? ?   \= \? \= ?
n �� m �� \{n,m\}   {n,m}       \{n,m\} \{n,m\}

�`�N�ƶ��G �U�� VI �s��{���n�P�W�����ʧ@�@�P�� magic �]�w�ﶵ�i��.

�|�@�ӹq�ܦW�檺�Ҥl:

....
1248   Kate 634
....
1548  Kerry 534
....

�n���ǰt�H 1 �}�Y, ���ۦ��@�Ǫ��ԧB�Ʀr, �M�� �ܤ֦��@�ӥH�W�����j�r���H�ΤH�W�O�H K �}�l���C�@�� �ڭ̥i�H�o�˼g:

grep '^1[0-9]\{1,\} \{1,\}K' phonelist.txt
�Ψϥ� * �ӭ��Ƥ��ǰt [0-9] �P���j�r��:
grep '^1[0-9][0-9]*  *K' phonelist.txt
��
egrep '^1[0-9]+ +K' phonelist.txt
��
perl -ne 'print if (/^1[0-9]+ +K/)' phonelist.txt

���Ʀr���|�N�e������@�r���˦��X�{�����ƥ[��. �ҥH "23*4" �����ܻ��o�|���ǰt " 2 �M�� 3 ����r�� 4" (�o���O "23.*4" ���t�q). �o�|���ǰt " 2 �@�� �M�� 3 �i��\�h���H�� 4 �@��"

�٦��@�ӧA�]���n�`�N�����I�N�O�o�ǭ��Ʀr���ܳg��. �]�N�O���b���˦����Ĥ@�ӥX�{�����Ʀr���|�ɥi��a�V �C���r���k�䩵���ҭn�ǰt���r��.

�B�⦡ ^1.*4
�N�|���ǰt��@���
1548  Kerry 534
�q�}�Y�@����̫᭱�� 4.
���O�o�N�O���|�u�ǰt�� 154.

�o�ӯS�ʹ� grep �u��{���èS������v�T���O���r���s��P�N�� �o�D�`���n.

�A���r���� �O��O

�A���r�����O�Я�O������èS�����ܹB�⦡������k���O �o�o����N�]�t�b�A�����˦��Ҥǰt�쪺��r�����O�а_��,�ҥH �b�B�⦡���᭱�i�H�A�ѦҨ�o.

�o�ӳQ�O�Ъ����e�i�H�g���ܼƨӨ��o. �Ĥ@�լA���r���ҰO�Ъ����e �i�H�g���ܼƤ@�Ө��o, �ĤG�լA���r���ҰO�Ъ����e�i�H�g���ܼƤG�Ө��o �̦�����.

�{���W���A���r���y�k�ܼƻy�k
grep\(\)\1
egrep()\1
perl()\1 or ${1}
vi,vim,vile,elvis\(\)\1
emacs\(\)\1

�Ҧp:

�B�⦡ [a-z][a-z] �N�|
���ǰt�G�Ӥp�g�r��.

�{�b�ڭ̥i�H�ϥ��ܼƨӷj�M��ﹳ�O 'otto' �o������r:

egrep '([a-z])([a-z])\2\1'

�ܼ� \1 �����e�O�r�� o
���ܼ� \2 �����e�O�r�� t.

�o�ӹB�⦡�]������ǰt�� anna �o�ӦW�r
���O yxyx �N���i�H�F.

�b�M�乳�O otto �M anna �o���W�r�ɨä��`�Ψ�A���r�����O�Я�O �ˬO��r���s��P�N���ɷ|�`�Ψ�o���O�Я�O.

���Υ��W�B�⦡����O�ӽs���r

�Q�b�s���r�ɭɥΥ��W�B�⦡����O�A�ݭn�@�ӹ��O vi, emacs �������s�边 �Ϊ̧A�]�i�H�ϥι��O perl �������{���y��.

�b emacs �s�边���A�i�H�ϥ� M-x �ӤU query-replace-regexp �R�O �άO�N query-replace-regexp �R�O�]�w�b�@�ǥ\����W. ��άO�A�]�i�H �ϥ� replace-regexp �R�O. ���L query-replace-regexp �O�ĥ�ͪ��覡, �ӫ�̫h�_.

�b vi �s�边����r���N���h�O�ϥ� :%s/ / /gc �o�˪��R�O. �䤤 �ʤ���r���O���j�M '����ɮ�' ���d��M�ӧA�]�i�H���N���A�Q�n�� �d��. �b vim �s�边���A�i�H���U shift-v ��ӼХܤ@�Ӱϰ�M��A �i�H�u�b�Хܪ��ϰ�W�ϥΥN����r���R�O. �b�o�̧ڨä��� vim �� �ϥΦh�@�����A�i�H�ѦҸӽs�边�Ҫ����۲߫��ɤ��. �ӥN���R�O�� �� 'gc' �O���ĥΥ�ͪ��覡. ���ϥΥ�ͪ��覡�i�H�U s/ / /g �o�� ���R�O.

�ҿץ�ͪ��覡�O���b�C�����ǰt��ɽs�边�|���ܸ߰ݧA �O�_�n����N����r���ʧ@.

�b perl �{���y�����A�i�H�ϥ�

perl -pe 's/ / /g' 

���ڭ̬ݤ@�I�Ҥl. �Ҧp�{�b�ڭ̤��q���s���p���w�g���F���� �N�O�Z�q�ܸ��X�O 1 �}�Y���H�b�ĤG����ԧB�Ʀr���᳣�|���J�@ �� 2 .

�]�N�O���p�G����q�ܸ��X�O 1423 �h�����ܦ� 14223.

�ª��W��:

Phone Name  ID
     ...
3412    Bob 123
3834  Jonny 333
1248   Kate 634
1423   Tony 567
2567  Peter 435
3567  Alice 535
1548  Kerry 534
     ...

�o�̬O�U�سB�z����k:

vi:    s/^\(1.\)/\12/g
emacs: ^\(1.\)   replaced by  \12
perl:  perl -pe 's/^(1.)/${1}2/g' phonelist.txt

�{�b�s���q�ܦW��ݰ_�ӹ��O�o��:

Phone Name  ID
     ...
3412    Bob 123
3834  Jonny 333
12248   Kate 634
14223   Tony 567
2567  Peter 435
3567  Alice 535
15248  Kerry 534
     ...

Perl �{���y���i�H�B�z�W�L \1 �� \9 ���O���ܼƦ]�� \12 �N�|���� �� 12 �ӰO���ܼƦ��ɳo���ܼƪ����e���M�O�Ū�. �n�ѨM�o�Ӱ��D�ڭ� �i�H�ϥ� ${1} ���覡.

�{�b�W�檺�ƦC�覡���I�����. �n�p��ץ��L?�A�i�H�o�ˤl�ոլ� �p�G�b�Ĥ��Ӧ�m�O�ťզr���A�N�A���J�@�Ӫťզr��:

vi:     s/^\(....\) /\1  /g
emacs:  '^\(....\) '  replaced by  '\1  '
perl:   perl -pe 's/^(....) /${1}  /g' phonelist.txt

�{�b�q�ܦW��ݰ_�ӹ��O�o��

Phone Name  ID
      ...
3412     Bob 123
3834   Jonny 333
12248   Kate 634
14223   Tony 567
2567   Peter 435
3567   Alice 535
15248  Kerry 534
      ...

�{�b���P�ƥH�H�u���覡�s��o�ӦW��åB�����|�b��r�檺�}�Y ���J�@�Ǫťզr��. �ڭ̭n�p��@�~����N�����h?

Phone Name  ID
      ...
3412     Bob 123
     3834   Jonny 333
12248   Kate 634
14223   Tony 567
 2567   Peter 435
3567   Alice 535
  15248  Kerry 534
      ...

�o�Ӱ��D���Ӧp���ѨM:

vi:     s/^  *//  (���ڭ̤��ϥ� + �ɥ����ϥ� 2 �Ӫťզr��)
emacs:  '^ +'  replaced by the empty string 
perl:   perl -pe 's/^ +//' phonelist.txt

���A�b���g�{���ɨϥΤF temp �P temporary �G���ܼ�. �{�b�A�Q�n �N�ܼ� temp ���ܼƦW�٧אּ counter. �p�G�A�ҧ@���u�O�N�� temp �o�Ӧr��h�ܼ� temporary �|�ܦ� counterorary �o���M���O�A�Q�n�� ���G.

���W�B�⦡�i�H�ѨM�o�Ӱ��D. �A�u�n�N temp([^o]) �N���� counter\1 �Y�i. �]�N�O��, �u�N�� temp �åB���t�r�� o ���r��. (�t�@�ӸѨM�覡 �N�O�ϥ���ɦr�����O�ڭ̨ä��b�o�����w��r���˦����Q�צo.)

�ڧƱ�o�g�峹����E�o�_�A�勵�W�B�⦡������. �{�b�A�i�ॲ���h �ݤ@�U�A�Ҩϥνs�边���ާ@�����P���H�K�J�Ӿ�Ѩ䥿�W�B�⦡���\��.

�٦��\�h�S���r�����ണ��A ���O����r��" | " �L�㦳 "�Ϊ�" ���N��H�Ϋe���һ�����ɦr��.

�̫�q���U��r�֡A �ï���αo�R���ֽ�C


����� ���j�� ��½Ķ

�D������ Miguel Angel Sepulveda ���@
© Guido Socher 1998
LinuxFocus 1998