亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1623 | 回復: 0
打印 上一主題 下一主題

使用Unix命令行模式高效地進行文本編輯 [復制鏈接]

論壇徽章:
1
15-16賽季CBA聯(lián)賽之北控
日期:2022-03-04 22:35:50
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-03-22 09:58 |只看該作者 |倒序瀏覽

簡單研究一下可節(jié)省時間和精力的一些基本命令行文本編輯程序。文本編輯操作通常在文本編輯器應用程序中交互式地進行。然而,有些任務可以直接從 UNIX® 命令行方便快捷地完成。此外,還可以在腳本中使用這些單命令行程序來自動化各種編輯過程。
大多數(shù) UNIX® 開發(fā)人員都選擇 Emacs、vi 或這兩個文本編輯應用程序的眾多變種、分支和克隆之一。操作員通常在所選的文本編輯器中打開文件,并交互式地對文件指定和應用更改。
但是與在文本編輯器中打開文件相比,您通?梢栽诿钚懈斓赝瓿删庉嫻ぷ。復雜的編輯過程可以從命令行進行編程和指定,并跨多個文件執(zhí)行,從而消除所有不必要的屏幕顯示、光標移動和與文件的人工交互。一種很好的策略是在手邊保留一些相關的命令行程序,以完成常見的編輯工作。它們不僅可以為您節(jié)省時間(尤其是在涉及到多個文件的批處理操作中),而且您還可以在腳本中使用它們。
用于編輯和處理文本的單命令行程序是 Perl 和 AWK(以及最近的 Ruby)語言(當然還包括 Shell)中有名的傳統(tǒng)功能。本文使用在所有系統(tǒng)上都隨時可用的三個最主要的命令行編輯工具來演示基本的文本編輯技術:cat、ed 和 sed。下面的編輯示例首先從最簡單和最常見的構(gòu)造開始,并逐步過渡到較復雜的構(gòu)造。
使用 cat 進行編輯
使用 cat(其名稱表示“連接”)來連接文件和標準輸入流,如清單 1 所示。世界上的懶鬼們還將它用作通用分頁程序 (cat file) 和完整的文本編輯環(huán)境 (cat > file)。其語法的簡單性無與倫比,而且對于文本編輯單命令行程序,它還為您提供了無需編輯器即可追加或插入文本的快捷方法。
清單 1. 使用 cat 來連接文件和標準輸入流
$ (cat - input1 - input2 - input3 - input4) | mailx ted
Ted,
Take a look at these example files.
This is the first file ...
Ctrl-D
This is the second file ...
Ctrl-D
This is the third file -- note the fourth paragraph below ...
Ctrl-D
And here's the last file ...
Ctrl-D
$
將文本添加到文件結(jié)尾
然而,懶鬼也是講策略的。當您需要將文本追加到文件結(jié)尾時,再沒有比使用 cat 更快的方法了:
$ cat >> file
> line
> line
> line
Ctrl-D
$
當您在添加行時,按 Ctrl-U 可以刪除當前行,按 Ctrl-Z 可以掛起該過程,按 Ctrl-C 可以中止所有操作。當您完成編輯時,可以在各行上按 Ctrl-D。(存在一些缺省的 Korn Shell 控制鍵,但它們適用于大多數(shù) Shell 和編輯模式。)
如果您正在輸入的數(shù)據(jù)是從另一個窗口粘貼而來的 X 選擇,則該單命令行程序通常更快速,因為您不必調(diào)用某個編輯器、打開目標文件、移動到文件末尾、粘貼選擇、保存文件然后再退出編輯器。當您是在粘貼格式化或特殊格式化的文本,并且您希望保留該格式(因為某些文本編輯器和編輯模式在您粘貼 X 選擇時會對其進行重新格式化)時,單命令行程序也會更有用。
雖然此操作非常常見,是一項日;顒,但是您必須小心使用 shell 操作符來追加 重定向(>>) 而不是普通重定向操作符 (>);如果您錯誤地使用了后者,則會使用原本打算追加的文本改寫文件的原有內(nèi)容。
若要將一個文件的全部內(nèi)容追加到另一個文件結(jié)尾,您可以給出文件名:
$ cat footnotes.txt >> file
如果您僅追加單行而不是多行或整個文件,您可以使用 echo 而不是 cat:
$ echo "192.255.255.255 bigblue" >> /etc/hosts
若要追加從 1 開始進行項目編號的文本行,可以使用 cat 的 -n 選項;這樣將在各行前面附加行號(最多偏移五個空格字符)和一個制表符。添加 -b 選項可以禁止對空白行編號:
$ cat -nb > file
This line is numbered
And so is this
Another numbered line
Ctrl-D
$ cat file
1 This line is numbered
2 And so is this
3 Another numbered line
$
在文件開頭插入文本
通過使用連字符 (-) 指定標準輸入并寫到一個新文件,您可以使用 cat 在文件開頭插入文本:
$ cat - file > newfile
This is the beginning of the file
And then the old file is inserted
Below this line:
Ctrl-D
$
雖然這個單命令行程序非常簡單,但是它的缺點在于創(chuàng)建了一個新文件。如果您希望將文本插入原始文件,則必須進行的重命名將使得此單命令行程序成事不足敗事有余。更好的方法是使用即將介紹的 ed。
顯示非打印字符
cat 具有若干個有用的選項。其中一些選項控制它輸出非打印字符的方式,例如制表符和控制字符。若要確定某個文件或某一組文本文件是否有嵌入的控制字符,可以使用這些選項。例如,如果某個文件具有尾隨空格,您就可以使用這些選項:
$ cat -vet input.txt
This line has trailing blanks. $
This line does not.$
$
這些選項隨 UNIX 實現(xiàn)而異;表 1 提供了標準 IBM AIX® 操作系統(tǒng)的選項。
表 1. AIX cat 中用于輸出控制的選項
選項 描述
-b 不對空白行編號。
-e 使用 $ 字符顯示行尾。
-n 從 1 開始對所有輸出行編號。
-q 使用靜默操作(禁止錯誤消息)。
-r 將所有多個空行替換為單行(“壓縮”空白)。
-S 將多個空白行壓縮到單行中(與 -r 相同)。
-s 禁止錯誤消息(靜默操作)。
-t 將制表符顯示為 ^I。
-u 不對輸出進行緩沖。
-v 可視地顯示非打印控制字符。
使用 ed 進行編輯
顧名思義,行編輯器 ed 對輸入文件的行執(zhí)行編輯。它將整個文件讀入自己的緩沖區(qū),對該副本執(zhí)行指定的操作,并可選地將緩沖區(qū)寫到磁盤。您可以在編輯操作中指定任何數(shù)量的行,并且這些操作可以在一個序列中進行組合和指定。這些事實使得 ed 成為在腳本中使用的理想選擇。以如下格式指定操作:
[address]command [text]
address 指定要處理的一行或多行(缺省為當前行),并且可以通過多種方式進行指定。單字符的 command 是要對指定行執(zhí)行的操作。對于腳本中的特別單命令行程序,可以使用 echo 將一組命令和文本管道傳輸給 ed,從而以非交互式的方式使用它。
( echo 'OPERATION'; echo 'OPERATION';
... echo 'wq' ) | ed -s FILENAME
如果在操作中輸入文本,應該回顯一個句點 (.) 來指示輸入結(jié)束。最后的 wq 寫入文件并退出。-s 選項使 ed 靜默地操作,并禁止所有正常輸出。
幸運的是,ed 的基本尋址方法和命令是相當標準化的。表 2 描述了主要的尋址形式。表 3 給出了命令。
表 2. 在 ed 中對行尋址
選項 描述
. 此選項對當前行尋址(缺省地址)。
number 此選項對第 number 行尋址?梢园炊禾柗指舻姆秶 (first,last) 對行尋址。0 代表緩沖區(qū)的開頭(第一行之前)。
-number 此選項對當前行之前的第 number 行尋址。如果沒有 number,則減號對緊跟在當前行之前的行尋址。
+number 此選項對當前行之后的第 number 行尋址。如果沒有 number,則加號對緊跟在當前行之后的行尋址。
$ 此選項對最后一行尋址。
, 此選項對第一至最后一行尋址,包括第一行和最后一行(與 1,$ 相同)。
; 此選項對當前行至最后一行尋址。
/pattern/ 此選項對下一個包含與 pattern 匹配的文本的行尋址。
?pattern? 此選項對上一個包含與 pattern 匹配的文本的行尋址。
表 3. 主要的 ed 命令
命令 描述
a 此命令在指定的地址之后追加文本。
c 此命令將指定的地址更改為給定的文本。
d 此命令刪除指定地址處的行。
i 此命令在指定的地址之前插入文本。
q 此命令在將緩沖區(qū)保存到磁盤后終止程序并退出。
r file 此命令讀取 filespec 的內(nèi)容并將其插入指定的地址之后。
s/pattern/replacement/ 此命令將匹配 pattern 的文本替換為指定地址中的 replacement 文本。
w file 此命令將指定的地址寫到 file。如果沒有 address,則此命令缺省使用整個緩沖區(qū)。
在文件開頭插入文本,第二部分
通過可在腳本中使用的 ed 單命令行程序,您可以容易地在文件開頭插入文本。插入操作是使用 ed 并通過 a 命令將給定文本追加到第 0 行(文件開頭)來完成的:
$ cat file
This is the end.
$ (echo '0a'; echo 'This is the beginning.'; echo '.'; echo 'wq') | ed -s file
$ cat file
This is the beginning.
This is the end.
$
您可以交互式地完成同樣的任務:
$ cat file
This is the end.
$ ed -s file
> 0a
> This is the beginning.
> .
> wq
$ cat file
This is the beginning.
This is the end.
$
若要在文件開頭插入另一個文件的內(nèi)容,可以使用 r 命令:
$ (echo '0r headnotes'; echo 'wq') | ed file
在給定字符串之后插入文本
您可以使用 ed 將任何數(shù)量的文本行插入文件中任意行之前或之后。若要在第一個包含給定字符串的行之后插入,可以將該字符串包括在斜杠中,并在后面跟著 a 命令以追加隨后的文本。與前面一樣,各個行使用一個句點結(jié)束,并使用 wq 寫入文件并退出。
當您希望在文件中的特定位置追加文本塊時,此項技術就會派上用場:
$ ( echo '/begin/a'; echo 'This is the middle.'; \
> echo '.'; echo 'wq') | ed -s file
$ cat file
This is the beginning.
This is the middle.
This is the end.
$
當您對一組文件執(zhí)行多行文本插入時,此項技術也非常有用。如果要插入大量的行,可以使用 here document,這是使用
$ for i in *.xml
> { ed -s $i > //a \
> \
> johnnycomelately \
> 10 \
> 4 \
> \
> .
> wq
> EOF
> }
$
您可以在給定字符串之后插入一個文件:
$ (echo '/END OF PART I/r footnotes.txt'; echo 'wq') | ed file
刪除行
使用 d 命令來刪除文件中的行。與本文討論的所有命令一樣,您可以指定任何類型的有效地址,例如特定的行或行范圍。在實踐中,此單命令行程序最適合于與至少一個匹配的模式結(jié)合使用,例如刪除從第一個匹配某模式的行到文件結(jié)尾的所有行:
$ ( echo '/FOOTNOTES/,$/d'; echo 'wq' ) | ed -s file
也可以按相反方向執(zhí)行此操作,并刪除從該文件的第一行到第一個匹配某模式的行的所有內(nèi)容:
$ ( echo '1,/\.\.\./d'; echo 'wq' ) | ed -s file
刪除尾隨空格
通過使用 s 命令并替換一個空替換字符,您可以刪除尾隨空格:
$ cat -vet input.txt
This line has trailing blanks. $
This line does not.$
$ (echo ',s/ *$//'; echo 'wq') | ed -s input.txt
$ cat -vet input.txt
This line has trailing blanks.$
This line does not.$
$
使用 sed 進行編輯
本文討論的最復雜和最強大的編輯工具是 sed(流編輯器)。它是一個文本編輯器,但是與諸如 ed 等文本編輯器不同,它編輯輸入流并寫到輸出流。因此,它對于編輯命令輸出或?qū)τ谑褂闷渌ぞ邔ξ募M行預處理非常有用——然后您可以將該文本通過管道直接輸出給 sed,以進行快速編輯。但是 sed 還可以操作文件,并且其腳本語言具有高級模式匹配功能,因此它是用于執(zhí)行任何類型的快速文本編輯的理想選擇——例如對一組文件進行快速搜索和替換。事實上,它是現(xiàn)有用于文本編輯的最流行命令行工具之一。
sed 接受包含任何數(shù)量命令的腳本,后面跟著可選的指定輸入文件的選項;缺省情況下,它讀取標準輸入。某些版本的 sed 有一個 -i 選項,此選項指定應該編輯的輸入文件。(如果沒有此選項,則讀取輸入文件,而不對其執(zhí)行寫入。)如果您安裝的版本支持此選項,則應該使用它——它允許您使用單個命令對任何指定的文件執(zhí)行快速編輯操作。
sed -i script filespec
以下示例假設您的 sed 支持 -i 選項。否則,您必須使用 Shell 重定向?qū)⑤敵霰4娴叫挛募,并在另一個步驟將新文件重命名為舊文件,從而執(zhí)行臨時文件中轉(zhuǎn):
sed script file > newfile; mv newfile file
對于多個文件,您必須執(zhí)行循環(huán):
for i in *; { sed script $i > $i.new; mv $i.new $i; }
替換文件中的文本
您可以使用 s/searchstring/replacestring/ 構(gòu)造將給定字符串替換為另一個字符串。若要替換某個文件中每行上的第一個 old 實例,可以使用以下命令:
$ sed -i 's/old/new/' file
若要替換每個實例,可以對該搜索追加 g 選項。此項技術對于修復輸入錯誤或替換一個或一組文件中的重復單詞、短語或其他內(nèi)容非常理想。
$ sed -i 's/Esclipse/Eclipse/g' *.xml
您可以在輸入表達式中將字符包括在方括號中,但是,如果您在替換文本中使用方括號,則會將它們視為普通字符:
$ cat file
This is the beginning.
This is the middle.
This is the end.
$ sed 's/[Tt]h/[Tt]h/g' file
[Tt]his is [Tt]he beginning.
[Tt]his is [Tt]he middle.
[Tt]his is [Tt]he end.
當要搜索或替換的短語包括斜杠字符時,應使用它來定義新的分隔符:
$ sed -i 's,/usr/local/websphere,/usr/websphere,' file
您還可以將包含某個模式的整個行替換為某些新文本:
$ sed -i 's/.*pattern.*/LINE DELETED/' file
編輯匹配的模式
回想一下在模式中將字符分組在一起的方括號示例,以及如何在替換文本中將它們視為普通字符。如果您希望在替換文本中包括字面匹配的模式,該怎么辦呢?可以使用“和”號 (&) 來實現(xiàn)。此方法對于通過在匹配模式之前或之后放置文本來編輯匹配模式是非常有用的:
$ cat file
This is the beginning.
This is the middle.
This is the end.
$ sed 's/[Tt]h/>&Thth>Thth>Thth
在匹配模式之后插入文本
使用 a 命令在給定的匹配模式后面添加一行文本:
$ sed -i '/pattern/a text' file
這并不替換與模式匹配的文本——它只是在第一個包含該模式的行后面添加文本。
在行開頭插入文本
若要在每行開頭插入文本,可以匹配脫字號元字符并提供要插入的文本。下面顯示了如何向文件中的所有行添加電子郵件樣式引用:
$ sed 's/^/> /' input.txt
> This line has trailing blanks.
> This line does not.
$
在行尾插入文本
同樣的原理也適用于在每行結(jié)尾插入文本——匹配美元符號元字符并提供要插入的文本。下面演示了如何模擬 AIX cat 的 -vet 選項來標記尾隨空格:
$ sed 's/$/$/' file
This line has trailing blanks. $
This line does not.$
$
刪除文件中的行
d 命令刪除給定的行。您可以在它前面附加行號、范圍、要匹配或包括在斜杠中的模式。
若要刪除文件中的第一行,可以使用以下命令:
$ sed -i 1d file
若要刪除第 1 至第 10 行,可以使用以下命令:
$ sed -i 1,10d file
若要刪除“BEGIN QUOTE”字符串的第一個實例到“END QUOTE”字符串的第一個實例之間的所有行,可以使用以下命令:
$ sed -i '/BEGIN QUOTE/,/END QUOTE/d' file
若要刪除當前目錄中擴展名為 .xml 的所有文件中第一行包含“”并且最后一行包含“""”的所有文本部分,可以使用以下命令:
$ sed -i '//,//d' *.xml
若要刪除從第一行直到第一個空白行的所有內(nèi)容,可以使用以下命令:
$ sed -i '/^> /d' file
(當在電子郵件消息或 Usenet 文章中使用時,前述單命令行程序?qū)⒊ニ袠祟^。)
若要刪除所有以電子郵件樣式引用開頭的行,可以使用以下命令:
$ sed -i /^$/d file
若要刪除文件的最后一行,可以使用以下命令:
$ sed -i '$d' file
刪除尾隨空格
如果文件中的行包含需要清除的尾隨空格字符,在文本編輯器中人工查找并刪除它們會非常麻煩,但是使用 sed 完成此任務將成為一個快速的單行操作。您可以搜索行尾之前出現(xiàn)一次或多次的字面空格字符,并將其替換為空字符:
$ cat -vet input.txt
This line has trailing blanks. $
This line does not.$
$ sed -i 's/ *$//' input.txt
$ cat -vet input.txt
This line has trailing blanks.$
This line does not.$
$
總結(jié)
通過從 UNIX 命令行運行單命令行程序,可以利用多種有意義和復合的方式(無需編輯器)對文本文件進行編輯。您這樣做有許多很好的理由:為了提高速度和方便性,在無法或不適合使用交互式編輯的情況下可編寫腳本,有時為了對單個文件或一組文件執(zhí)行復雜編輯,這些編輯操作難于甚至無法在交互式應用程序中完成。本文使用三個普遍存在的編輯工具,通過許多簡單文本編輯單命令行程序闡述了這一概念:cat、ed 和 sed。


本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/31/showart_503408.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP