本文是要講linux 不打開文檔/文件的情況下,替換文本內容。
打開文檔,在文檔/文件內替換內容的,可以用vim,可參考這篇文章vim 替換文本 。
話題相關
#linux 文件替換字符串
#sed 字符串替換
#shell 文件替換某行
#linux 替換指定行內容
#linux 替換某行
linux一般用sed來替換文本到指定行。
基本語法
s
(substitute)爲查找替換命令
# 在輸出或打印中,替換字符串。並不改變原文件內容
sed '作用範圍s/替換查找目標/替換成爲/替換目標option' 文件名
# 替換字符串,並更改原文件內容
# 在sed後面加 -i,即編輯文檔“edit files in place”選項
sed -i '作用範圍s/替換查找目標/替換成爲/替換目標option' 文件名
例,sed ‘s/cat/dog/g’ pet.txt
在全局範圍(s前的作用範圍無內容)查找cat並替換爲dog,作用範圍內每一行出現的不僅第一個目標,而是所有目標都會被替換(g)。
作用範圍選項
- 作用範圍在全文的每一行,不寫內容
# 作用範圍在全文
sed 's/cat/dog/g' pet.txt
這一點這vim中的作用範圍不太一樣,vim中不寫作用範圍是作用於光標所在的當前行,而sed是指全文範圍的每一行。
- 指定行,寫上行號;指定某行到某行,用逗號連接行號
# 作用範圍在第1行
sed '1s/cat/dog/g' pet.txt
# 作用範圍在第6行到第10行
sed '6,10s/cat/dog/g' pet.txt
# 作用範圍在第6行到最後一行
sed '6,$s/cat/dog/g' pet.txt
# 作用範圍在指定行到其後2行,用加號(減號不可用)
sed '1,+2s/cat/dog/g' pet.txt
替換查找目標 寫法
- 替換某個字符串,就寫這個字符串。
這是最基本的用法。
# 替換cat這個字符串
sed '1s/cat/dog/g' pet.txt
- 替換整行,用
.*
個人經驗,替換一整行的情況是用的最多的。
# 替換第1行一整行爲dog
sed '1s/.*/dog/' pet.txt
# 這裏因爲.*已代表一整行,所有後面寫上/g和上面相同效果
sed '1s/.*/dog/g' pet.txt
# 替換全文的每1行爲dog
sed 's/.*/dog/' pet.txt
# 這裏因爲.*已代表一整行,所有後面寫上/g和上面相同效果
sed 's/.*/dog/g' pet.txt
例,
$ cat test.txt
a,b,c
a,b,c
# 替換第1行整行
$ sed '1s/.*/hello/g' test.txt
hello
a,b,c
$ sed '1s/.*/hello/' test.txt
hello
a,b,c
# 替換全文每一行的全部內容
$ sed 's/.*/hello/g' test.txt
hello
hello
$ sed 's/.*/hello/' test.txt
hello
hello
- 替換一個字符,用
.
這個用的相對少一些。
# 替換第1行的每一個字符
sed '1s/./dog/g' pet.txt
# 替換第1行的第1個字符
sed '1s/./dog/' pet.txt
# 替換第1行的第5個字符
sed '1s/./dog/5' pet.txt
例,
$ echo '123'|sed 's/./dog/g'
dogdogdog
$ echo '123'|sed 's/./dog/'
dog23
$ echo '123'|sed 's/./dog/3'
12dog
# 字符也包括符號
$ echo ',123'|sed 's/./dog/1'
dog123
替換目標option
- 前面出現的
g
,作用範圍內行的所有查找目標,而不僅是第一個查找目標
# 替換全文每一行的每一個 cat 爲 dog
sed 's/cat/dog/g' pet.txt
- 沒有g,作用範圍內所在行的第1個目標
# 替換全文每一行的第1個 cat 爲 dog
sed 's/cat/dog/' pet.txt
- 不打印出全文,僅打印更改所涉及行,或者說僅打印受影響的行
在sed後面加-n
,是阻止默認的自動打印模式的選項,
同時在 替換目標option 的位置 寫上p
,表明打印print。
# 打印發生替換的行
sed -n 's/cat/dog/gp' pet.txt
sed的y命令
不同於上面的s
命令,以字符串或模式爲單位替換爲一個整體,y
是羅列置換每個對應的字符。
語法
sed 'y/查找的各個字符/對應替換後的各個字符/' 文件名
sed ‘y/abc/123’ test.txt ,這個命令會依次替換a,b,c爲1,2,3 。
查找的各個字符
與對應替換後的各個字符
的長度要一致。
例,
$ echo 'a,b,c,d,e'|sed 'y/abcde/12345/'
1,2,3,4,5
$ cat test.txt
a,b,c
a,b,c
$ sed 'y/abcde/12345/' test.txt
1,2,3
1,2,3
再比如 $ sed ‘1,5y/abcde/ABCDE/’ test.txt 是把1-5行內所有abcde轉變爲大寫,但是,正則表達式元字符不能使用這個命令。
例,
$ cat copy.txt
wang yi
zhang san
li qi
# 想要把1-2行的小寫轉化爲大寫,正則表達式不可用
$ sed '1,2y/[a-z]/[A-Z]/' copy.txt
wAng yi
ZhAng sAn
li qi
# 羅列全部字母,來替換
$ sed '1,2y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' copy.txt
WANG YI
ZHANG SAN
li qi
(以上。)