日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

通用線程--sed 實例,第2部分


通用線程 -- sed 實例,第 2 部分
sed 是十分強大和小巧的文本流編輯器 。在本文章系列的第二篇中,DanIEl Robbins 為您演示如何使用 sed 來執(zhí)行字符串替換、創(chuàng)建更大的 sed 腳本以及如何使用 sed 的附加、插入和更改行命令 。
sed 是很有用(但常被遺忘)的 Unix 流編輯器 。在以批處理方式編輯文件或以有效方式創(chuàng)建 shell 腳本來修改現(xiàn)有文件方面,它是十分理想的工具 。本文是前一篇介紹 sed 文章的續(xù)篇 。替換!
讓我們看一下 sed 最有用的命令之一,替換命令 。使用該命令,可以將特定字符串或匹配的規(guī)則表達式用另一個字符串替換 。下面是該命令最基本用法的示例:$ sed -e "s/foo/bar/" myfile.txt
上面的命令將 myfile.txt 中每行第一次出現(xiàn)的 "foo"(如果有的話)用字符串 "bar" 替換,然后將該文件內(nèi)容輸出到標準輸出 。請注意,我說的是每行第一次出現(xiàn),盡管這通常不是您想要的 。在進行字符串替換時,通常想執(zhí)行全局替換 。也就是說,要替換每行中的所有出現(xiàn),如下所示:$ sed -e "s/foo/bar/g" myfile.txt
在最后一個斜杠之后附加的 "g" 選項告訴 sed 執(zhí)行全局替換 。關于 "s///" 替換命令,還有其它幾件要了解的事 。首先,它是一個命令,并且只是一個命令,在所有上例中都沒有指定地址 。這意味著,"s///" 還可以與地址一起使用來控制要將命令應用到哪些行,如下所示:$ sed -e "1,10s/enchantment/entrapment/g" myfile2.txt
上例將導致用短語 "entrapment" 替換所有出現(xiàn)的短語 "enchantment",但是只在第一到第十行(包括這兩行)上這樣做 。$ sed -e "/^$/,/^END/s/hills/mountains/g" myfile3.txt
該例將用 "mountains" 替換 "hills",但是,只從空行開始,到以三個字符 "END" 開始的行結(jié)束(包括這兩行)的文本塊上這樣做 。關于 "s///" 命令的另一個妙處是 "/" 分隔符有許多替換選項 。如果正在執(zhí)行字符串替換,并且規(guī)則表達式或替換字符串中有許多斜杠,則可以通過在 "s" 之后指定一個不同的字符來更改分隔符 。例如,下例將把所有出現(xiàn)的 /usr/local 替換成 /usr:$ sed -e "s:/usr/local:/usr:g" mylist.txt
在該例中,使用冒號作為分隔符 。如果需要在規(guī)則表達式中指定分隔符字符,可以在它前面加入反斜杠 。規(guī)則表達式混亂
目前為止,我們只執(zhí)行了簡單的字符串替換 。雖然這很方便,但是我們還可以匹配規(guī)則表達式 。例如,以下 sed 命令將匹配從 "<" 開始、到 ">" 結(jié)束、并且在其中包含任意數(shù)量字符的短語 。下例將刪除該短語(用空字符串替換):$ sed -e "s/<.*>//g" myfile.HTML
這是要從文件除去 HTML 標記的第一個很好的 sed 腳本嘗試,但是由于規(guī)則表達式的特有規(guī)則,它不會很好地工作 。原因何在?當 sed 試圖在行中匹配規(guī)則表達式時,它要在行中查找最長的匹配 。在我的前一篇 sed 文章中,這不成問題,因為我們使用的是 "d" 和 "p" 命令,這些命令總要刪除或打印整行 。但是,在使用 "s///" 命令時,確實有很大不同,因為規(guī)則表達式匹配的整個部分將被目標字符串替換,或者,在本例中,被刪除 。這意味著,上例將把下行:This is what I meant.
變成:meant.
我們要的不是這個,而是:This is what I meant.
幸運的是,有一種簡便方法來糾正該問題 。我們不輸入“"<" 字符后面跟有一些字符并以 ">" 字符結(jié)束”的規(guī)則表達式,而只需輸入一個“"<" 字符后面跟有任意數(shù)量非 ">" 字符并以 ">" 字符結(jié)束”的規(guī)則表達式 。這將與最短、而不是最長的可能性匹配 。新命令如下:$ sed -e "s/<[^>]*>//g" myfile.html
在上例中,"[^>]" 指定“非 ">"”字符,其后的 "*" 完成該表達式以表示“零或多個非 ">" 字符” 。對幾個 html 文件測試該命令,將它們管道輸出到 "more",然后仔細查看其結(jié)果 。更多字符匹配

推薦閱讀