sed 文件查找,替換

sed 命令查找與替換:


(1)刪除第2,3行:sed '2,3d' test.txt > new.txt

(2)替換:
 替換所有:sed 's/abc/ABC/' test.txt >new.txt
 查找:    sed  -n "/abc/p" test.txt

 匹配字符串中的一部分: echo abc123 | sed 's/\([a-z]*\).*/\1/'

 echo "ab001_ac" | sed 's/\(.*\)\_\(.*\)/\1,\2/'      \1表示第一個括號匹配的字符
 echo "ABC01" | sed "s/[A-Z]*\([0-9]*\)/\1/"           \1匹配後面的數字部分

 echo "ab001_AC88" | sed 's/[A-Z]*\([0-9]*$\)/\1/'

 echo "a001_aaST88" | sed "s/\(.*\)\([A-Z][A-Z]\)\([0-9]*$\)/\2/"

sed "s/^/\"&/" <31.txt >32.txt 行首添加雙引號
sed "s/$/\"&/" <32.txt >33.txt 行尾添加雙引號
sed "s/[ ]*$//" <34.txt >35.txt 替換行尾空格


 只顯示指定行範圍的文件內容,例如:

# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log

sed -n $n"p" 22.txt  顯示某一行  n=2

sed大小寫轉換?


如何先查找,再追加所查找的行到一個新的文件:

 

(3)查找Tab:
sed "s/[ ]\{2,\}/\|/g"          查找Tab,查找多空格,單獨一個空格的除外

awk '/3\t/' 34.txt  查找\t

sed -n '/3[[:space:]]/p' 34.txt  查找空格

sed "/\\t/p" 34.txt  查找tab

 echo "\tabc\t23" | sed 's/[[:tab:]]/-/' 替換tab

sed -n '/[[:space:]]*/p' 34.txt  查找tab
如何只替換第2個\t?

(4)
行末空格 
sed 's/[ \t]*$//g'


(5)替找空格:
echo "abc  23" | sed 's/[ ]\{2,\}/ /'  把多個空格替換成一個空格

(3)
如果你想在每行的80個字符後加一個冒號,你可寫:
sed ‘s/./&:/80’ < file > new

    你也可以以蠻力解決,如下:
sed 's/^................................................................................/&:/' <file >new

(4)找一個sed命令在文件每一行加一個變量的例子:
 sed 's/.*/&-/' <20.txt >new.txt

用&作爲匹配的串
有時你想查找一個模式,然後加上幾個字符,比如在匹配的串前後加上括號。如果你是找一個確定的字符串,還是比較簡單的,如下即可:
sed ‘s/abc/(abc)/’ < old > new

如果你不是非常清楚你將找到的是串是什麼,那你應該如果來利用你找到的串做某種替換呢?
答案就是你需要一個特定的字符”&”,它即指代匹配的模式
sed ‘s/[a-z]*/(&)/’ < old > new

你可以在替換時多次使用”&”,比如,你可以次每行開頭的數字複製一次,如下:
% echo “123 abc” | sed ‘s/[0-9]*/& &/’

123 123 abc

讓我再修正一下這個例子,sed會以貪婪的方式匹配第一個串。對於’[0-9]*’的第一個區配是第一個字符,因爲這個正則是匹配0個或多個數字。所以如果輸入是”abc 123”,輸出也不會改變(當然,除了有一個空格在字母之前)。一個能保證能匹配一個數字的更好的複製數字的方法是:
% echo “123 abc” | sed ‘s/[0-9][0-9]*/& &/’

123 123 abc

(5)sed 中如何使用變量(變量使用單引號包起來):

 echo "abc" | sed 's/ab/'$v'/'


如何在文件的每一行的最前面加一個字符串和空格!
sed 's/^/ttt /g' test


如何在文件的每一行的最前面加一個字符串和空格!
sed 's/^/ttt /g tese | sed 's/$/ sss\&/g'


如何在文件的每一行的最前面加一個字符串和空格!
sed 's/^/ttt /g tese | sed 's/$/ sss\&/g'

(7)匹配空行:
查找空行:sed -n "/^$/p" 20.txt
刪除空行:sed "/^$/d" <20.txt >21.txt


n 不打印; sed不寫編輯行到標準輸出,缺省爲打印所有行(編輯和未編輯),p命令可以用來打印編輯行
      c 下一命令是編輯命令,使用多項編輯時加入此選項
      f 如果正在調用sed腳本文件,使用此選項,此選項通知sed一個腳本文件支持所用的sed命令,如
          sed -f myscript.sed input_file  這裏myscript.sed即爲支持sed命令的文件


(21) 只顯示指定行範圍的文件內容,例如:

# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log

(22)退出狀態
sed不向grep一樣,不管是否找到指定的模式,它的退出狀態都是0。只有當命令存在語法錯誤時,sed的退出狀態纔不是0。

(23)y命令
該命令與UNIX/Linux中的tr命令類似,字符按照一對一的方式從左到右進行轉換。例如,y/abc/ABC/將把所有小寫的a轉換成A,小寫的b轉換成B,小寫的c轉換成C。
 
sed '1,20y/hrwang12/HRWANG^$/' datafile
#將1到20行內,所有的小寫hrwang轉換成大寫,將1轉換成^,將2轉換成$。
#正則表達式元字符對y命令不起作用。與s命令的分隔符一樣,斜線可以被替換成其它的字符。

(24)% echo “123 abc” | sed ‘s/[0-9][0-9]*/& &/’

123 123 abc

字符串”abc”沒有改變,因爲它沒有匹配正則表達式,如果你想在輸出中刪除”abc”,你必須擴展正則表達式來匹配行的其它的部分,並顯式地用”(”,”)”和”\1”來指名,這就是下節的內容了。
用\1來指明匹配的部分
我已經在正則表達式那一章中介紹了”(” ”)”和”\1”的用法。現在複習一下,被轉義的括號(即,有反斜槓在前面的括號)來記錄正則表達的某一部分。”\1”是被記錄的第一個模式,”\2”是第二個被記錄的模式。Sed可以記錄9個模式。
如果你想保存每行的第一個單詞,並刪除行的其它部分,你可以用下面的命令:
sed ‘s/\(\[a-z]*).*/\1/’

我應該再詳細地解釋一下。正則表達式是以貪婪的方式匹配。”[a-z]*”匹配0個或多個小寫字母,它會盡量匹配更多的小寫字母。”.*”會在第一個匹配後匹配0個或多個字符。因爲第一個模式已經匹配了所有的小寫字母,第二個模式會匹配剩下的字符,所以你使用命令:
echo abcd123 | sed ‘s/\([a-z]*\).*/\1/’

會輸出”abcd”,而刪除後面的數字。
如果你想調換兩個單詞的位置,你可記錄兩個模式,並改變它們的次序。
sed ‘s/\([a-z]*\) \([a-z]*\)/\2 \1/’

注意兩個模式中間是有空格的。這個可保證找到兩個單詞。但是[a-z]*這種模式會匹配0個字母,如果你想至少匹配一個字母,你可以用下面的命令:
sed ‘s/\([a-z][a-z]*\) \([a-z][a-z]*\)/\2 \1/’

“\1”並不需要一定出現在替換串中(右部),它你也可以在查找的模式中(左部)。如果你想刪除重複的單詞,你可以用:
sed ‘s/\([a-z]*\) \1/\1/’

注意你最多使用9個值,從”\1”到”\9”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章