Shell之sed用法 轉滴

2021-09-06 12:43:45 字數 3531 閱讀 6593

unix系統裡,每行結尾只有「《換行》」,即「\n」;windows系統裡面,每行結尾是「《換行》《回 車》」,即「\n\r」。乙個直接後果是,unix系統下的檔案在windows裡開啟的話,所有文字會變成一行;而windows裡的檔案在 unix下開啟的話,在每行的結尾可能會多出乙個^m符號。

好了,所以我的問題就出在被處理的檔案的每行末尾都有^m符號,而這通常是看不出來的。可以用"cat -a test.file"命令檢視。因此當我想在行尾新增字元的時候,它總是新增在行首且會覆蓋掉原來行首的字元。

要把檔案轉換一下,有兩種方法:

1.命令dos2unix test.file

2.去掉"\r" ,用命令sed -i 's/\r//' test.file

好了,這樣處理完,就ok啦!!!

awk函式的定義方法如下:  function 函式名(參數列)

sed -e 's/123/1234/' a.txt 

將a.txt檔案中所有行中的123用1234替換(-e表示命令以命令列的方式執行;引數s,表示執行替換操作) 

# sed -e '3,5 a4' a.txt 

將a.txt檔案中的3行到5行之間所有行的後面新增一行內容為4的行(引數a,表示新增行,引數a後面指定新增的內容) 

# sed -e '1 s/12/45/' a.txt 

把第一行的12替換成45 

sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir` 

批量處理通過grep搜尋出來的所有文件,將這些文件中所有的oldstring用newstring替換(-i引數表示直接對目標檔案操作) 

$ sed -n 's/^test/mytest/p' example.file 

(-n)選項和p標誌一起使用表示只列印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就列印它。(^這是正規表示式中表示開頭,該符號後面跟的就是開頭的字串)(引數p表示列印行) 

$ sed 's/^wangpan/&19850715/' example.file 

表示被替換換字串被找到後,被替換的字串通過&符號連線給出的字串組成新字元傳替換被替換的字串,所有以wangpan開頭的行都會被替換成它自已加19850715,變成wangpan19850715 

$ sed -n 's/\(love\)able/\1rs/p' example.file 

love被標記為1,所有loveable會被替換成lovers,而且替換的行會被列印出來。需要將這條命令分解,s/是表示替換操作,\(love\)表示選中love字串,\(love\)able/表示包含loveable的行,\(love\)able/\l表示love字串標記為1,表示在替換過程中不變。rs/表示替換的目標字串。這條命令的操作含義:只列印替換了的行 

$ sed 's#10#100#g' example.file 

不論什麼字元,緊跟著s命令的都被認為是新的分隔符,所以,「#」在這裡是分隔符,代替了預設的「/」分隔符。表示把所有10替換成100。 

$ sed -n '/love/,/unlove/p' example.file 

只列印包含love字串行到包含unlove字串行之間的所有行(確定行的範圍就是通過逗號實現的) 

$ sed -n '5,/^wang/p' example 

只列印從第五行開始到第乙個包含以wang開始的行之間的所有行 

$ sed '/love/,/unlove/s/$/wangpan/' example.file 

對於包含love字串的行到包含unlove字串之間的行,每行的末尾用字串wangpan替換。 

字串$/表示以字串結尾的行,$/表示每一行的結尾,s/$/wangpan/表示每一行的結尾新增wangpan字串 

$ sed -e '11,53d' -e 's/wang/pan/' example.file 

(-e)選項允許在同一行裡執行多條命令。如例子所示,第一條命令刪除11至53行,第二條命令用pan替換wang。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第乙個替換命令將影響第二個替換命令的結果。(引數d,表示刪除指定的行) 

$ sed --expression='s/wang/pan/' --expression='/love/d' example.file 

乙個比-e更好的命令是--expression。它能給sed表示式賦值。 

$ sed '/wangpan/r file' example.file 

file裡的內容被讀進來,顯示在與wangpan匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。引數r,表示讀出檔案,後面空格緊跟檔名稱 

$ sed -n '/test/w file' example.file 

在example.file中所有包含test的行都被寫入file裡。引數w,表示將匹配的行寫入到指定的檔案file中 

$ sed '/^test/a\oh! my god!' example.file 

'oh! my god!'被追加到以test開頭的行的後面,sed要求引數a後面有乙個反斜槓。 

$ sed '/test/i\oh! my god!' example.file 

'oh! my god!'被追加到包含test字串行的前面,引數i表示新增指定內容到匹配行的前面,sed要求引數i後面有乙個反斜槓 

$ sed '/test/' example.file 

如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變為bb。引數n,表示讀取匹配行的下乙個輸入行,用下乙個命令處理新的行而不是匹配行。sed要求引數n後跟分號 

$ sed '1,10y/abcde/abcde/' example.file 

把1—10行內所有abcde轉變為大寫,注意,正規表示式元字元不能使用這個命令。引數y,表示把乙個字元翻譯為另外的字元(但是不用於正規表示式) 

$ sed -i 's/now/right now/g' test_sed_command.txt 

表示直接操作檔案test_sed_command.txt,將檔案test_sed_command.txt中所有的now用right now替換。引數-i,表示直接操作修改檔案,不輸出。 

$ sed '2q' test_sed_command.txt

在列印完第2行後,就直接退出sed。引數q,表示退出 

$ sed -e '/old/h' -e '/girl-friend/g' test_sed_command.txt 

首先了解引數h,拷貝匹配成功行的內容到記憶體中的緩衝區。在了解引數g,獲得記憶體緩衝區的內容,並追加到當前模板塊文字的後面。上面命令列的含義:將包含old字串的行的內容儲存在緩衝區中,然後將緩衝區的內容拿出來新增到包含girl-friend字串行的後面。隱含要求蒐集到緩衝區的匹配行在需要新增行的前面。 

$ sed -e '/test/h' -e '/wangpan/x' example.file 

將包含test字串的行的內容儲存在緩衝區中,然後再將緩衝區的內容替換包含wangpan字串的行。引數x,表示行替換操作。隱含要求蒐集到緩衝區的匹配行在需要被替換行的前面。

shell指令碼 sed的用法

sed在處理文字時是逐行讀取檔案內容,讀到匹配的行就根據指令做操作,不匹配就跳過。sed是linux下一款功能強大的非互動流式文字編輯器,可以對文字檔案進行增 刪 改 查等操作,支援按行 按欄位 按正則匹配文字內容,靈活方便,特別適合於大檔案的編輯。詳細用法參考 shell指令碼 sed的用法 se...

shell學習 sed用法的例項

替換文字中的字串 sed s book books file n選項和p命令一起使用表示只列印那些發生替換的行 sed n s test test p file sed i s book books g file使用字尾 g 標記會替換每一行中的所有匹配 sed s book books g fil...

shell 檔案內容替換 sed用法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!呼叫sed命令有兩種形式 sed options command file s sed options f scriptfile file s 刪除 d命令 sed 2d example 刪除example檔案的第二行。sed 2,d exampl...