linux之sed命令

最近在複習shell腳本,看到《linux命令行與shell腳本編程大全》第19章關於sed的介紹,下面作了一些用法總結。linux

1 初識sed

sed編輯器被稱做流編輯器,它和vim這種的交互式文本編輯器不一樣,是根據命令來處理數據流中的數據。會執行下列操做:正則表達式

  • 一次從輸入中讀取一行數據(重複該操做直到所有行被讀取完)
  • 根據編輯器命令匹配數據
  • 按照命令修改數據流中的數據
  • 將新數據輸出到STDOUT(標準輸出)

其中sed命令的能夠從命令行中輸入,也能夠從一個命令文件中讀取。shell

sed -e script 添加script中指定的命令編程

sed -f file 添加file中指定的命令vim

1.1 在命令行定義sed命令

來看一個簡單的文本替換示例:bash

echo "hi,my name is xxx" | sed 's/xxx/kinsomy/'
 #修改文件
sed 's/xxx/kinsomy/' data.txt
 #執行多個命令 用-e選項,分號隔開
sed 's/xxx/kinsomy/; s/***/hhh/' data.txt
複製代碼

將echo輸出的數據經過管道輸入sed中,而後用s命令進行替換,用第二個斜槓後的數據替換掉第一個斜槓後匹配的數據。編輯器

注意:sed操做文本文件中的數據,僅僅是將修改的數據輸出到STDOUT,可是並不會修改文件自己的數據spa

1.2 從文件讀取命令

在一個文件script.sed中定義一系列的命令,方便複用。命令行

s/*/a
s/x/b
s/-/+
複製代碼



# -f選項指定命令文件
sed -f script.sed data.txt
複製代碼

2 sed基礎

2.1替換標記

上面的例子echo "hi,my name is xxx" | sed 's/xxx/kinsomy/'只會替換每一行中匹配到的第一個數據,可是一行數據中如有多個匹配項,則不能所有被替換掉。3d

echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/'
 #輸出
hi,my name is kinsomy, i am xxx
複製代碼

這個時候能夠使用一些替換標記substitution flag來設置替換的模式。替換標記跟在替換字符串以後。

s/pattern/replacement/flags

  • 數字,表示將替換掉第幾處被匹配到的數據
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/2'
 #輸出 第二個xxx被替換成kinsomy
hi,my name is xxx, i am kinsomy
複製代碼
  • g,表示替換全部匹配到的數據
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/g'
 #輸出 第二個xxx被替換成kinsomy
hi,my name is kinsomy, i am kinsomy
複製代碼
  • p,表示會打印出被匹配出來的行
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/p'
#輸出
hi,my name is kinsomy, i am xxx
hi,my name is kinsomy, i am xxx
複製代碼
  • w,將替換後輸出保存到指定文件
echo "hi,my name is xxx, i am xxx" | sed 's/xxx/kinsomy/w output.txt'
複製代碼

2.3 行尋址

上文說到sed命令是一行行讀取文本,進行匹配操做數據,知道全部行被遍歷完,若是這時候咱們想要對特定的行作操做就要使用行尋址。 行尋址有兩種形式:

  • 數字形式表示行
# 操做單行
$ sed '2s/xxx/***/' data.txt
 # 操做必定行區間[2,4]
$ sed '2,4s/xxx/***/' data.txt
 # 操做某行開始到最後[2,endline]
$ sed '2,$s/xxx/***/' data.txt
複製代碼
  • 文本模式過濾器

首先在/etc/passwd內找到kinsomy的記錄,而後將bash替換爲csh。文本模式過濾器配合正則表達式會很強大。

sed '/kinsomy/s/bash/csh/' /etc/passwd
複製代碼

2.4 刪除行

使用刪除命令d對文本進行刪除操做。

# 刪除全部文本
sed 'd' data.txt
 # 刪除單行
sed '2d' data.txt
 # 刪除行區間[2,3]
sed '2,3d' data.txt
 # 刪除行區間[2,endline]
sed '2,$d' data.txt
 # 刪除匹配文本aa的行
sed '/aa/d' data.txt
 # 刪除兩個匹配文本之間的文本 匹配到1和3的行之間的文本所有被刪除
sed '/1/,/3/d' data.txt
複製代碼

2.5 插入、附加文本

  • 插入命令i在指定行前增長新行
  • 附加命令a在指定行後增長新行
# 追加
echo "Line 2" | sed 'a\
pipe quote> Line 1'
 #插入
echo "Line 2" | sed 'i\
pipe quote> Line 1'
複製代碼

2.6 修改行

c命令用來修改一行數據

# 修改第三行文本
sed '3c\
pipe quote> change line ' data.txt
複製代碼

2.7 轉換命令

命令格式 sed 'y/inchar/outchar'

將inchar中的字符一一對應地轉換成outchar的字符

echo "This 1 is a test of 1 try." | sed 'y/123/456/'
 # 輸出
This 4 is a test of 4 try.
複製代碼
相關文章
相關標籤/搜索