工作中經常有編輯超大的文本文件,有的達百兆有的幾個G,notepad++打開不了或者即使打開批量編輯一下也相當耗時。
既然Linux那么快,可以用sed 命令s參數(substitute)進行替換。
問:如下文本,如何替換第6到第7位的字符為XX?即只替換AA,AB,12,*(
12001AA
12001AB
1200112
12001*(
答:
sed替換語法
sed 's/被匹配的字符/新字符' 文件路徑
解決問題的關鍵在怎么用正則匹配到固定位置。
可參見下列鏈接正則匹配固定位置字符串
解法一:sed -r 's/(?<=^.{5}).{2}/XX/' file1
說明:將前5位字符作為一組零寬的正則,不作為最后匹配結果,只會匹配后2位字符並作為最后結果。
但是,很不幸的是此sed命令有一個問題,sed命令不支持零寬斷言。其實sed還不支持基本的正則元字符,如\w, \b, \s, \d等,可以用[a-zA-Z0-9_],[0-9]等等效替換。

解法二:sed -r 's/(^.{5})(.{2})/\1XX/' file1
說明:將前5位字符作為一組,后2位字符作為另一組,保留第一組不變,再添上XX,第二組直接丟掉(沒有\2)。間接實現固定位置的替換。
這里利用了零寬斷言和分組有時可以轉換。
下圖,雖然正則把12001AA都被匹配到了,但在sed替換命令中因為分為兩組,只取第一組加上XX,丟棄第二組,所以最終結果也會只替換AA。

注意:sed中使用正則時,轉義字符的使用和正常使用正則一樣。即只有把作為正則中的元符號作為普通符號使用時,才要轉義,否則無需轉義。
如果你有更好的解決方案或者發現文中有不足之處,歡迎留言評論。^_^
2021.07.09
Russell
