linux 給文件替換字符串/替換內容/替換某行 (shell,sed)

本文是要講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

(以上。)

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