Linux 添加文本到指定行/在文件的指定行添加內容(shell, sed)

話題相關
#Linux如何添加文本到指定行
#shell如何添加文本到指定行
#sed 插入文本

用sed來插入文本到指定行。

基本語法

  • 只是在屏幕輸出/打印中顯示更改,並不改變文件本身內容
sed '作用範圍行 插入行前/行後 插入內容' 文件名
# 中間的空格也可省略
sed '作用範圍行插入行前/行後插入內容' 文件名
# 常常在插入內容前留空格
sed '作用範圍行插入行前/行後 插入內容' 文件名
  • 添加文本常常需要的是添加內容到文件裏,更新文件,要在sed後面加 -i,是編輯文檔“edit files in place”選項。
sed -i '作用範圍行 插入行前/行後 插入內容' 文件名

插入行前/行後

# sample.txt文件第1行前面添加“hello”;實質就是插入內容到文件第1行
sed -i '1 i hello' sample.txt

# sample.txt文件第1行後面添加“hello”;實質就是插入內容到文件第2行
sed -i '1 a hello' sample.txt

行前用 i ,行後用a
ia常用。
當然要插入內容到最後一行就得用a了。同樣要插入內容到文件第一行需要用i

所以這個插入操作要注意行號的變化。下面的內容多次添加文本時注意具體寫了注意的內容。

作用範圍行

注意如果是剛建好的空文件是寫不進內容的,因爲空文件沒有行號。
(sed是不能處理空文件的,可參考這篇文章。 鏈接:sed不能處理空文件

最後一行用$表示。

  • 插入內容到某行,直接寫指定行號。

把內容插入到某行應該是最常用的。 也是本文題目所指。

# 把"hello"插入到第2行
sed -i '2i hello' sample.txt

# 把"hello"插入到最後一行
sed -i '$a hello' sample.txt
  • 行號位置爲空,即不寫行號,就是作用範圍在全文每一行
sed -i 'i hello' sample.txt

效果是這樣的,

$ cat test.txt 
a
b
c
d
# 不寫行號,作用在每一行
$ sed 'i hello' test.txt 
hello
a
hello
b
hello
c
hello
d

注意這一點這vim中的作用範圍不太一樣,vim中不寫作用範圍的話是作用於光標所在的當前行,而sed是指全文範圍。

  • 指定某行到某行,用逗號連接行號
$ sed '2,4 i hello' test.txt 

效果是這樣的,

$ cat test.txt 
a
b
c
d
# 作用在原本的第2行到第4行
$ sed '2,4 i hello' test.txt 
a
hello
b
hello
c
hello
d

多次添加文本時注意

本文講的插入方法,就像上面講的,插入的是指定行的行前/行後,也就是是相對位置。
比如,

# 把"hello"插入到第2行
sed -i '2i hello' sample.txt

這個例子裏的插入到第2行,實際上插入到原來的第2行前面取代了第2行,之前的第2行在插入內容後就變成了第3行。

如果多次插入內容,要注意行號是隨着內容的更新而更新的。

比如這個失敗的例子,想要把hello1寫到第1行,hello2寫到第2行。

# 失敗的例子
# 文件原本的內容
$ cat test.txt 
happy,happy,c
a,cat,c

$ sed -i '2i hello2' test.txt
# 此時的確將hello2 插入到了第二行
$ cat test.txt 
happy,happy,c
hello2
a,cat,c

$ sed -i '1i hello1' test.txt
# 這時雖然將hello1插入第2行,但是hello2就不再是在第2行,而跑去了第3行
$ cat test.txt 
hello1
happy,happy,c
hello2
a,cat,c

按行號順序插入是一個解決方法。

如果是要求將內容絕對地插入指定行,應該考慮文本替換。

# 文本替換是絕對的指定行
# 例,設定第3行內容爲hello3
sed '3s/.*/hello3/' test.txt

文本替換相關的內容可以參考這篇文章 sed 文本替換

(以上。)

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