Linux文本處理之如何比較很長的字符串

直接來個例子: 比較字符串 abcd  和 abde  

$ cat string_01.txt
abcd
$ cat string_02.txt
abde
$ diff <(sed 's|.|&\n|g' string_01.txt) <(sed 's|.|&\n|g' string_02.txt)
3d2
< c
4a4
> e

解析:

1. 我們是比較很長的字符串,所以不會直接把字符串放在命令行中,而是會放到單獨的文件中。

2. 基本思路是想要藉助diff命令比較每個字符。要實現這個目標的關鍵就是如何把每個字符放到每行。我們使用sed命令實現了字符串到每行一個字符的轉變。

3. 關於sed此處 的語法,我有兩個疑惑,一是, 豎線有什麼特殊意義嗎? 通常不是用斜線嗎?  二是,那個&號是幹什麼用的?

參考了一下:http://docstore.mik.ua/orelly/unix3/sedawk/ch05_03.htm,就完全解決了我的疑惑。 裏面是這麼講的, sed替換命令的語法結構是

[address]s/pattern/replacement/flags

其中的正則表達式可以用除換行符以外的任何字符去分割, 比如用歎號,相應的例子如下:

s!/usr/mail!/usr2/mail!

這個例子是吧 /usr/mail 替換成了  /usr2/mail 。到這,我們就清楚了,上面的sed命令中豎線的作用和歎號是一致的。 這就解決了我第一個疑惑;

那裏面還講到,在replacement部分, & 號是有特殊意義的: 它會被替換爲正則表達式所匹配的字符串。 這解決了我第二個疑惑。

那麼,兩個疑惑已解決,sed的語法就比較清楚了。 (大家能懂我意思嗎?)

發佈了27 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章