使用sed在文件中定位文本的方式

sed是實現對流的編輯。一般,咱們使用sed能夠實現內容的編輯後而後保存成另外的一個文件,若是正確的話,才寫入到源文件。可是某些時候,咱們須要直接修改文件,由於,保存文件到一個文件,而後再覆蓋原文件的辦法顯得很麻煩。其實很簡單,只須要一個 -i 參數就能夠了。
好比,我想替換文件中的 properties 爲 property ,可使用
sed  -i -n 's/properties/property/g'  build.xml
另外 -n 選項能夠取消屏幕的輸出信息

 
PS: 經測試 部份內容有問題 須要更正
把一個文件裏的文件傳FTP.

ftp -in <<EOF
open 10.0.0.1
user uname passwd
$(sed 's/^/mput /' ftpfile.txt)
bye
EOF

使用s e d在文件中定位文本的方式 php

x x爲一行號,如1
x , y 表示行號範圍從x到y,如2,5表示從第2行到第5行
/ p a t t e r n / 查詢包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查詢包含兩個模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在給定行號上查詢包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 經過行號和模式查詢匹配行。3 . / v d u /
x , y ! 查詢不包含指定行號x和y的行。1 , 2 !
html


使用s e d在文件中定位文本的方式 正則表達式

x x爲一行號,如1
x , y 表示行號範圍從x到y,如2,5表示從第2行到第5行
/ p a t t e r n / 查詢包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查詢包含兩個模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在給定行號上查詢包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 經過行號和模式查詢匹配行。3 . / v d u /
x , y ! 查詢不包含指定行號x和y的行。1 , 2 !
shell

sed編輯命令 編程

p 打印匹配行
= 顯示文件行號
a 在定位行號後附加新文本信息
i 在定位行號後插入新文本信息
d 刪除定位行
c 用新文本替換定位文本
s 使用替換模式替換相應模式
r 從另外一個文件中讀文本
w 寫文本到一個文件
q 第一個模式匹配完成後推出或當即推出
l 顯示與八進制A S C I I代碼等價的控制字符
{ } 在定位行執行的命令組
n 從另外一個文件中讀文本下一行,並附加在下一行
g 將模式2粘貼到/pattern n/
y 傳送字符
n 延續到下一輸入行;容許跨行的模式匹配語句
app


例子
sed -n '2p' file.txt //打印第二行
sed -n '1,4p' file.txt //print 1-4 line
sed -n '1,$p' file.txt //print all
編輯器

sed -n '/require/'p cart.php /匹配require
sed -n '/$/'p cart.php /匹配$特殊字符 要用
sed -n '/.*uire/'p cart.php
sed -n -e '/require/p' -e '/require/=' cart.php //匹配require 而且打印行號
sed -n '/require/=' cart.php //只打印匹配的行號
工具


替換命令用替換模式替換指定模式,格式爲:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
s選項通知s e d這是一個替換操做,並查詢p a t t e r n - t o - f i n d,成功後用r e p l a c e m e n t - p a t t e r n替
換它。
替換選項以下:
g 缺省狀況下只替換第一次出現模式,使用g選項替換全局全部出現模式。
p 缺省s e d將全部被替換行寫入標準輸出,加p選項將使- n選項無效。- n選項不打印輸出
結果。
w 文件名使用此選項將輸出定向到一個文件。
學習

sed 's/class/CLASS/' cart.inc 例如:
sed 's/class/CLASS/g' cart.inc //替換全部的匹配項目
測試

sed 's/class/CLASS/w cart.inc' out.file //替換後的結果輸出到 out.file中

sed '/require./r cart.php' 1.php //把cart.php文件中/require 後面的數據添加到1.php以前。
sed 's/##*//g' 1.php //把1.php文件中全部##替換成空格。

sed 's/^0*//g' 1.php //把行首的0設爲空。
sed 's/^M//g' 1.php //除去控制字符^M 鍵。

^M 的產生 ,<ctrl>+V 按J
^[[ 的產生 <ctrl>+V + 方向鍵 <-

處理報文輸出

1) 使用s/-*//g刪除橫線- - - - - -。
2) 使用/^$ / d刪除空行。
3) 使用$d刪除最後一行
4) 使用1d刪除第一行。
5) 使用awk {print $1}打印第一列。
命令以下,這裏使用了cat,並管道傳送結果到sed命令
cat cart.php |sed 's/--*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'


快速一行命令
下面是一些一行命令集。([ ]表示空格, [ ]表示t a b鍵)
‘s / . $ / / g’ 刪除以句點結尾行
‘-e /abcd/d’ 刪除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替
‘s / ^ [ ] [ ] * / / g’ 刪除行首空格
‘s / . [ ] [ ] * / [ ] / g’ 刪除句點後跟兩個或更多空格,代之以一個空格
‘/ ^ $ / d’ 刪除空行
‘s / ^ . / / g’ 刪除第一個字符
‘s /CO L ( . . . ) / / g’ 刪除緊跟C O L的後三個字母
‘s / ^ / / / g’ 從路徑中刪除第一個
‘s / [ ] / [ ] / / g’ 刪除全部空格並用t a b鍵替代
‘S / ^ [ ] / / g’ 刪除行首全部t a b鍵
‘s / [ ] * / / g’ 刪除全部t a b鍵


——————————————————————————————————

sed命令學習筆記收藏

http://victoryseason.blog.sohu.com/110677264.html

1.簡介

sed是源於行編輯器ed的非交互式的流(stream-oriented)編輯器。sed之因此稱爲「流」編輯器,是由於象大多數UNIX程序同樣,輸入流過它,而後被導向標準輸出。sed編輯器逐行處理文件(或輸入),把當前處理的行存儲在稱爲「模式空間」(pattern space)的臨時緩衝區中,接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。sed處理完一行後將其從模式空間中刪除,而後讀入下一行進行處理和輸出。sed是對文件副本進行編輯和修改,因此不用擔憂會修改或破壞原文件。sed主要用來自動編輯一個或多個文件,簡化對文件的反覆操做和編寫轉換程序等。   

2. 使用格式

sed的使用格式以下:

sed [-n] [-e]  ‘instruction’  file(s)
sed [-n] –f  scriptfile  file(s)

sed的instruction格式以下:

[address[,address]][!]command [arguments]

3.選項

sed的主要選項有:

選 

功 

-n

取消默認的輸出

-e

容許多行編輯

-f

指定sed腳本文件名

-i[SUFFIX]

修改原文件,若是提供suffix,做備份

-r

使用擴展正則表達式

4. 指令地址

sed指令能夠指定0、1或2個地址:

<!--[if !supportLists]-->0)  <!--[endif]-->命令應用於全部行;

<!--[if !supportLists]-->1)  <!--[endif]-->命令令應用於任何符合這一地址的行

<!--[if !supportLists]-->2)  <!--[endif]-->命令應用與從第1個地址到第2個地址之間的行

5. 命令(command)

sed的命令主要有:

令 

功 

d

刪除行

p

打印行

對所選行以外的全部行應用命令

=

打印行號

s

替換命令(如’s/^west/north/g’)注意查找替換分隔符沒必要是’/’,而能夠是換行符和反斜線外的任何字符(如s#^west#north#g

r

讀文件

w

寫文件

a\

在當前行後添加一行或多行

i\

在當前行以前插入文本

c\

用新文本代替當前行中的文本

l

顯示模式空間中的內容,顯示非打印字符爲兩字節ASCII碼

y

將一字符轉換爲另外一字符(如:[address]y/abc/xyz/)

n

讀入下一行,並將其讀入模式緩衝區中,任何命令都將應用於下一行

q

結束或退出sed

D

刪除多行pattern space中到\n爲止

N

將下一行附加到上一行

P

打印到多行pattern space的\n爲止

H(h)

Hold命令,附加(H)或拷貝(h)pattern space的內容到hold space(暫存區)

    G(g)

Get命令,附加(拷貝)暫存區的內容到pattern space

     x

Exchange命令,互換hold space和pattern space的內容

     b

Branch(跳轉)命令([address]b[label])

     t

Test(測試)命令([address]t[label])

5. sed正則表達式元字符

元字符

使  用

.

除換行(\n)以外的任何字符

*

匹配0或多個前導字符,至關於\{0,\} (如:/*love/)

+

匹配1或多個前導字符,至關於\{1,\} 注意這是擴展元字符

[...]

匹配指定字符組內的任一字符 (如:/[Ll]ove/

\{n,m\}

匹配至少n個,至多m個前導字符;\{n\} 將匹配正好 n個, \{n,\}將匹配至少n個 (如:/o\{5,10\}) 

^

行首定位符

$

行尾定位符

\

取消轉義字符

\( \)

保存已匹配的字符,最多可定義9個標籤(如:s/\(love\)able/\1er/)

\n

獲取以上獲取的第n個標籤

&

保存查找串以便在替代串中引用 (如 s/love/**&**/g)

\<

詞首定位符  /\<love/

\>

詞尾定位符  /love\>/

6. sed腳本編程

 在命令行使用sed時經常會涉及到和shell的交互,而使用sed腳本則徹底沒必要要爲此操心。再也不用引號來確保sed命令不被shell解釋,並且可用反斜槓來續行。另外,對於腳本中的多個指令,應注意sed是對一行使用完了全部指令後再轉到下一行的。sed的這種選擇使得它能夠方便地處理大文件(沒必要將整個文件一次讀進內存)。另外,應注意sed對於腳本中輸入的命令很是挑剔,在命令的末尾不能有任何空白或文本,若是在一行中有多個命令,要用分號分隔。開始的{後不準有空格,結束的}必須單起一行。這一點與awk的比較自由的使用方式造成對比。sed中使用多行指令的示例以下:

/^\.TS/,/^\.TE/{ /^$/d s/^\.ps 10/.ps 8/ s/^\.vs 12/.vs 10/ }

7. sed中使用shell變量

sed如何使用shell變量?

好比在shell中定義了一個var變量,如何在sed中調用此變量?能夠考慮如下方法:

  • 將日常的單引號改成雙引號(Shell裏單引號中全部字符都做字面解釋):

sed "s/mytext/$var/g" file

對於某些mytext這種方法可能不起做用。

  • 一個單引號改成兩個

sed 's/mytext/'$var'/g' file

8.理解與補充說明

  • grep與sed的區別。grep ‘John’ datafile對應的sed命令是sed –n ‘/John/p’ datafile。區別:

(1)使用grep時,正則表達式沒有包含在//分隔符中,而sed須要包含在//之間

(2)sed默認會輸出每一行,因此須要用-n命令阻止默認輸出

(3)返回狀態。若是grep在文件中找到指定模式,將返回狀態0,不然返回1。sed則

不論是否找到指定模式,它的退出狀態都是0,只有命令存在語法錯誤時,sed的

退出狀態纔不是0。

     sed爲何要設計得如此「麻煩」呢?初用者在想只輸出匹配行時每每忘記加-n選項。

這是由於sed首先是一個編輯器,而不是一個查找工具。好比當咱們須要替換文件的

一部分時能夠用不加-n選項的sed ‘s/a/b/g’ file實現。

  • 比較sed與ed/vi理解ed/vi的current-line addressing和sed的global line addressing很是重要:在ed/vi中使用定址來擴展命令處理行;而在sed中使用定址來限制處理的行。在ed/vi中,除非你告訴處理哪些行,不會處理什麼,而在sed中,它將工做於每一行除非你告訴它不處理。
  • 關於命令括在單引號中。這不是必須的,可是應養成老是這樣作的良好習慣單引號對能夠避免shell解釋在編輯指令中出現的特殊字符或空格(shell使用空格來分別提交給程序的不一樣參數,對於shell的特別字符在命令調用以前被擴展),因此當指令中存在空格時是必須使用單引號的。
  • sed註釋。#用來註釋。System V只認第一列的#,而GNU sed則能夠將#符號放在任何地方。可是注意,若是第一二個字符是#n 表示腳本不會自動輸出結果,至關於指定了一個命令行參數-n
  • 在命令行中使用多指令的三種方法。(1)在指令之間加分號(2)在每一指令以前加-e;(3)使用Shell的多行記錄功能(前面加’後能夠直接換行,shell會等待用戶輸入’後再解釋。
  • 最新版本的-i選項能夠很方便地實現多文件直接修改,值得好好注意。

 

 

Shell中的grep、awk和sed的經常使用命令和語法

Grep的經常使用命令語法1. 雙引號引用和單引號引用
在g r e p命令中輸入字符串參數時,最好將其用雙引號括起來。例如:」m y s t r i n g」。這樣作有兩個緣由,一是以防被誤解爲 s h e l l命令,二是能夠用來查找多個單詞組成的字符串,例如:」jet plane」,若是不用雙引號將其括起來,那麼單詞 p l a n e將被誤認爲是一個文件,查詢結果將返回」文件不存在」的錯誤信息。
在調用變量時,也應該使用雙引號,諸如: g r e p」$ M Y VA R」文件名,若是不這樣,將
沒有返回結果。
在調用模式匹配時,應使用單引號.[root@mypc ]# echo `grep 123 111.txt`  (#注意是反單引號)

2. 經常使用的g r e p選項有:
-c   只輸出匹配行的計數。
-i   不區分大小寫(只適用於單字符)。
-h   查詢多文件時不顯示文件名。
-l   查詢多文件時只輸出包含匹配字符的文件名。
-n   顯示匹配行及行號。
-s   不顯示不存在或無匹配文本的錯誤信息。
-v   顯示不包含匹配文本的全部行。

3. 特殊的–在多個文件中進行查詢
$ grep 「sort」*.doc     ( #在當前目錄下全部. d o c文件中查找字符串」s o r t」)
 
$ grep 「sort it」 *      (#或在全部文件中查詢單詞」sort it」)
接下來的全部示例是指在單個文件中進行查詢
4. 行匹配
$ grep -c 「48″ data.f
$ 4                      (#g r e p返回數字4,意義是有4行包含字符串」4 8″。)
$ grep 「48″ data.f          (#顯示包含」4 8″字符串的4行文本)

5. 顯示知足匹配模式的全部行行數:
[root@mypc oid2000]# grep -n 1234 111.txt
1:1234
3:1234ab

6. 精確匹配
[root@mypc oid2000]# grep 「1234\>」 111.txt
1234

7. 查詢空行,查詢以某個條件開頭或者結尾的行。
結合使用^和$可查詢空行。使用- n參數顯示實際行數
[root@mypc oid2000]# grep -n 「^$」 111.txt    (返回結果 2:   #說明第二行是空行)
[root@mypc oid2000]# grep -n 「^abc」 111.txt (#查詢以abc開頭的行)
[root@mypc oid2000]# grep -n 「abc$」 111.txt  (#查詢以abc結尾的行)

8. 匹配特殊字符,查詢有特殊含義的字符,諸如$ . ‘ 」 * [] ^ | \ + ? ,必須在特定字符前加\。
[root@mypc oid2000]# grep  「\.」 111.txt  (#在111.txt中查詢包含」.」的全部行)
[root@mypc oid2000]# grep  「my\.conf」  111.txt (#查詢有文件名my. c o n f的行)

9. 目錄的查詢
[root@mypc oid2000]# ls -l |grep 「^d」      (#若是要查詢目錄列表中的目錄)
[root@mypc oid2000]# ls -l |grep 「^d[d]」    (#在一個目錄中查詢不包含目錄的全部文件)
[root@mypc]# ls -l |grpe 「^d…..x..x」 (#查詢其餘用戶和用戶組成員有可執行權限的目錄集合)

Awk的經常使用命令語法

awk命令擅長格式化報文或從一個大的文本文件中抽取數據包,下面是該命令的基本語法
awk [-F filed-separator] 「commands」 input-file(s)
[ - F域分隔符]是可選的,a w k使用空格做爲缺省的域分隔符,若是在要處理的文件中是以冒號做爲分割域的(如passwd文件),則在處理的時候要這樣指明 awk -F: command input-file(s)

1.1域和記錄
a w k執行時,其瀏覽域標記爲$ 1,$ 2 . . . $ n。這種方法稱爲域標識。使用$ 1 , $ 3表示參照第1和第3域,注意這裏用逗號作域分隔。若是但願打印一個有 5個域的記錄的全部域,沒必要指明 $ 1 , $ 2 , $ 3 , $ 4 , $ 5,可以使用$ 0,意即全部域。

1.2保存a w k輸出
$ awk ‘{print $0}’ input-files > out-files    (#重定向保存輸出)
$ awk ‘{print $0}’ input-files | tee out-files  (#使用t e e命令,輸出到文件的同時輸出到屏幕)

1.3 經常使用的awk命令舉例
[root@mypc /]# awk ‘$0 ~ /user/’ /etc/passwd  (#若是某域含有user就將該行打印出來)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# awk ‘/user/’ /etc/passwd      (#同上)
[root@mypc /]# awk -F: ‘{if ($5 ~ /user/) print $0}’ /etc/passwd (#如第五域有user則輸出該行)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’  (#從ifconfig的輸出中抽取含inet的行並打印第二域)
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’ | awk -F: ‘{print $2}’ (#在上面的基礎上再抽取,這個命令可讓你直接獲得本機的ip地址)

Sed的經常使用命令語法
Sed是一個非交互性文本流編輯器。它編輯文件或標準輸入導出的文本拷貝。

1.行的匹配
[root@mypc /]# sed -n ‘2p’ /etc/passwd  打印出第2行
[root@mypc /]# sed -n ‘1,3p’ /etc/passwd 打印出第1到第3行
[root@mypc /]# sed -n ‘$p’ /etc/passwd   打印出最後一行
[root@mypc /]# sed -n ‘/user/’p /etc/passwd 打印出含有user的行
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# sed -n ‘/\$/’p /etc/passwd  打印出含有$元字符的行,$意爲最後一行

2.插入文本和附加文本(插入新行)
[root@mypc /]# sed -n ‘/FTP/p’ /etc/passwd  打印出有FTP的行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@mypc /]# sed ‘/FTP/ a\ 456′ /etc/passwd 在含有FTP的行後面新插入一行,內容爲456
[root@mypc /]# sed ‘/FTP/ i\ 123′ /etc/passwd在含有FTP的行前面新插入一行,內容爲123
[root@mypc /]# sed ‘/FTP/ i\ 「123″‘ /etc/passwd在含有FTP的行前面新插入一行,內容爲」123″
[root@mypc /]# sed ‘5 a\ 123′ /etc/passwd         在第5行後插入一新行,內容爲123
[root@mypc /]# sed ‘5 i\ 「12345″‘ /etc/passwd   在第5行前插入一新行,內容爲」12345″

3.刪除文本
[root@mypc /]# sed ‘1d’ /etc/passwd  刪除第1行
[root@mypc /]# sed ‘1,3d’ /etc/passwd  刪除第1至3行
[root@mypc /]# sed ‘/user/d’ /etc/passwd  刪除帶有user的行

4. 替換文本,替換命令用替換模式替換指定模式,格式爲:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
[root@mypc /]# sed ’s/user/USER/’ /etc/passwd     將第1個user替換成USER,g代表全局替換
[root@mypc /]# sed ’s/user/USER/g’ /etc/passwd    將全部user替換成USER
[root@mypc /]# sed ’s/user/#user/’ /etc/passwd    將第1個user替換成#user,如用於屏蔽做用
[root@mypc /]# sed ’s/user//’ /etc/passwd         將第1個user替換成空
[root@mypc /]# sed ’s/user/&11111111111111/’ /etc/passwd  若是要附加或修改一個很長的字符串,可使用( &)命令,&命令保存發現模式以便從新調用它,而後把它放在替換字符串裏面,這裏是把&放前面
[root@mypc /]# sed ’s/user/11111111111111&/’ /etc/passwd  這裏是將&放後面

5. 快速一行命令
下面是一些一行命令集。([ ]表示空格,[ ]表示t a b鍵)
‘s / \ . $ / / g’ 刪除以句點結尾行
‘-e /abcd/d’ 刪除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替
‘s / ^ [ ] [ ] * / / g’ 刪除行首空格
‘s / \ . [ ] [ ] * / [ ] / g’ 刪除句點後跟兩個或更多空格,代之以一個空格
‘/ ^ $ / d’ 刪除空行
‘s / ^ . / / g’ 刪除第一個字符
‘s /COL \ ( . . . \ ) / / g’ 刪除緊跟C O L的後三個字母
‘s / ^ \ / / / g’ 從路徑中刪除第一個\
‘s / [ ] / [ ] / / g’ 刪除全部空格並用t a b鍵替代
‘S / ^ [ ] / / g’ 刪除行首全部t a b鍵
‘s / [ ] * / / g’ 刪除全部t a b鍵
若是使用s e d對文件進行過濾,最好將問題分紅幾步,分步執行,且邊執行邊測試結果。
經驗告訴咱們,這是執行一個複雜任務的最有效方式。

 

 

 

  1. awk '/^$/{print NR}'
複製代碼
  1. sed -n '/^$/='
複製代碼

 

[root@localhost ~]# nl test.txt
     1  hahahaha
     2  aaaaaaa
     3  aaaaaaa

     4  bbbbbbbbbbbbb
     5  vvvvvvvv
     6  ddddddddd
     7  vvvvvvvv
     8  aaaaaaa
     9  bbbbbbbbbbbbb
    10  ddddddddddd
    11  $
    12  #
    13  345
    14   345
    15  a5^
[root@localhost ~]# nl test.txt | grep -vn "[1-9]"
4:
[root@localhost ~]#

nl 文件名
默認就會加行號顯示.空白行不加行號.

若是須要空白行也加行號能夠輸入
nl -b a 文件名

 

 



若是要自動把行號前面用0填充能夠
[root@localhost ~]# nl -n rz test.txt
000001  hahahaha
000002  aaaaaaa
000003  aaaaaaa
000004  bbbbbbbbbbbbb
000005  vvvvvvvv
000006  ddddddddd
000007  vvvvvvvv
000008  aaaaaaa
000009  bbbbbbbbbbbbb
000010  ddddddddddd
000011  $
000012  #
000013  345
000014   345
000015  a5^


[root@localhost ~]#

-w 後面能夠決定填充幾個0.能夠本身試試。。
nl -n rz -w 4 test.txt|grep -nv "^0"

因此這樣也能夠實現樓主要求

相關文章
相關標籤/搜索