文本處理三劍客之 sed

来源:https://www.cnblogs.com/flashfish/archive/2019/04/17/10722583.html
-Advertisement-
Play Games

sed:文本流編輯器 主要是對文件的快速增刪改查,查詢功能中最常用的是過濾,取行 sed [選項] [sed內置命令字元] [輸入文件] Options: -n:取消預設的sed輸出,常與sed內置命令p連用 -e:直接在命令行界面進行sed動作編輯,多點編輯 -r:使用擴展的正則表達式 -i:直接 ...


sed:文本流編輯器

  主要是對文件的快速增刪改查,查詢功能中最常用的是過濾,取行

  sed [選項] [sed內置命令字元] [輸入文件]

  

 

 

  Options:

    -n:取消預設的sed輸出,常與sed內置命令p連用

sed -n '/要過濾的內容/或者行號p'

    -e:直接在命令行界面進行sed動作編輯,多點編輯
    -r:使用擴展的正則表達式
    -i:直接修改讀取的文件內容,而不是由屏幕輸出。若是不加此參數,就只是修改記憶體中的數據,不影響磁碟中的數據

  script:

    地址定界:
      1、不給地址,對全文進行處理
      2、單地址,
      #:指定的行
      /pattern/:被此處模式所能夠匹配到的每一行

    地址範圍:
      #,#:從#到#之間的行,包括##

      #,+#:從#行到#+#行

      /pat1/,/pat2/:匹配第一次被模式一和第一次被模式二匹配的行之間的行,貪婪模式!!!
      #,/par1/:第#行到第一次被part1匹配的行

    編輯命令:
      d:刪除模式空間匹配的行

sed '3d' file.txt # 數字表示行號
sed '3,4d' file.txt # 3-4行刪除

      p:顯示模式空間中的內容

sed -n '2p' file.txt  # 匹配第二行內容,如果不加-n,會將匹配的內容輸出到屏幕兩次
sed -n '2p;4p' person.txt  2和4行
sed -n '/xiaolizi1/p;/xiaolizi2/p' person.txt 

      a[\]text:在指定行的後面追加文本,可使用\n實現多行追加

# 在第二行後追加內容
   sed '2a 要追加的內容' file.txt
# 追加多行內容
  sed '2a 要追加的內容\n要追加的內容' file.txt
sed  '$a 106,xiaolizi1\n107,xiaolizi2' person.txt  # 在最後一行追加兩行內容 $表示結尾

      i[\]text:在指定行的前面追加文本
      c[\]text:替換行為單行或多行文本
      w /path/somefile:保存模式空間匹配的行到指定文件
      r /path/somefile:讀取指定的文件的文本至模式空間匹配到的行的行後
      =:為模式空間中的行列印行號
      !: 對模式空間匹配的行取反處理

    查找替換:
      s///:支持使用其他分隔符:s@@@,s### ...

sed 's#替換前的內容#替換後的內容#g' file.txt  # g表示整個文本內容,也就是全局替換,如果不添加,只會替換第一個匹配到的內容

# 關於反向引用
  

[root@oldgirl ~]# #echo 123456 ==》 <123456>  # 轉換成此類格式的 \1表示引用前面第一個括弧內的內容
[root@oldgirl ~]# echo 123456|sed -r 's#(.*)#<\1>#g'
<123456>
[root@oldgirl ~]# #echo 123456 ==》<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#([1-6])#<\1>#g'
<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#.#<&>#g'
<1><2><3><4><5><6>
[root@oldgirl ~]# echo 123456|sed -r 's#.*#<&>#g'
<123456>

 

# 舉個慄子

# 需求將oldboy*.jpg圖片變為avi擴展名文件
# 第一個裡程:找出要替換的文件信息
[root@oldgirl ~]# ls oldboy*.jpg
oldboy01.jpg oldboy03.jpg oldboy05.jpg oldboy07.jpg oldboy09.jpg
oldboy02.jpg oldboy04.jpg oldboy06.jpg oldboy08.jpg oldboy10.jpg
[root@oldgirl ~]# ls oldboy*.jpg|sed 's#.*#&#g'
oldboy01.jpg
oldboy02.jpg
oldboy03.jpg
oldboy04.jpg
oldboy05.jpg
oldboy06.jpg
oldboy07.jpg
oldboy08.jpg
oldboy09.jpg
oldboy10.jpg
#  第二個裡程:拼湊批量修改文件的命令
[root@oldgirl ~]# ls oldboy*.jpg|sed 's#.*.jpg#&#g'
oldboy01.jpg
oldboy02.jpg
oldboy03.jpg
oldboy04.jpg
oldboy05.jpg
oldboy06.jpg
oldboy07.jpg
oldboy08.jpg
oldboy09.jpg
oldboy10.jpg

[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#\1#g'
oldboy01.
oldboy02.
oldboy03.
oldboy04.
oldboy05.
oldboy06.
oldboy07.
oldboy08.
oldboy09.
oldboy10.
[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv \1jpg#g'
mv oldboy01.jpg
mv oldboy02.jpg
mv oldboy03.jpg
mv oldboy04.jpg
mv oldboy05.jpg
mv oldboy06.jpg
mv oldboy07.jpg
mv oldboy08.jpg
mv oldboy09.jpg
mv oldboy10.jpg
[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv \1jpg \1avi#g'
mv oldboy01.jpg oldboy01.avi
mv oldboy02.jpg oldboy02.avi
mv oldboy03.jpg oldboy03.avi
mv oldboy04.jpg oldboy04.avi
mv oldboy05.jpg oldboy05.avi
mv oldboy06.jpg oldboy06.avi
mv oldboy07.jpg oldboy07.avi
mv oldboy08.jpg oldboy08.avi
mv oldboy09.jpg oldboy09.avi
mv oldboy10.jpg oldboy10.avi

# 第三里程碑:將命令輸出的信息,進行執行
[root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv \1jpg \1avi#g'|bash
[root@oldgirl ~]# ls oldboy*.avi
oldboy01.avi oldboy03.avi oldboy05.avi oldboy07.avi oldboy09.avi
oldboy02.avi oldboy04.avi oldboy06.avi oldboy08.avi oldboy10.avi

  

# 以上只是一個需求,為了演示反向引用,如果批量重命名的話,使用rename即可

    替換標記:

      g:行內全局替換
      p:顯示替換成功的行
      w file:將替換成功的行保存至文件中

+ g:[address[,address]]g 將hold space中的內容拷貝到pattern space中,原來pattern space里的內容清除

+ G:[address[,address]]G 將hold space中的內容append到pattern space\n後

+ h:[address[,address]]h 將pattern space中的內容拷貝到hold space中,原來的hold space里的內容被清除

+ H:[address[,address]]H 將pattern space中的內容append到hold space\n後

+ d:[address[,address]]d 刪除pattern中的所有行,並讀入下一新行到pattern中

+ D:[address[,address]]D 刪除multiline pattern中的第一行,不讀入下一行

PS:不論是使用G、g還是H、h,它們都是將hold space裡面的內容“copy”到patt

h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不再傳至標準輸 出),放棄之後的命令,但是對剩餘模式空間重新執行sed


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過yum命令只下載rpm包不安裝 經常遇到伺服器沒有網路的情況下部署環境,或者創建自己的 yum 倉庫等。每次都是在網上搜搜搜,都是五花八門,自己整理了下自己用到的以下三種方式,這裡沒有太多廢話,只是如何安裝並示例經常用到的方式,如果還需要更多參數 ,可以通過 --help 查看手冊: 方法一:y ...
  • 此博文是CentOS 7 在最小化安裝之後進行安裝Apache服務的操作步驟,httpd版本為httpd-2.4.34。 一、基本服務環境搭建 安裝apache需要的基本環境:apr apr-util pcre gcc gcc-c++ expat-devel Yum install -y gcc g ...
  • GAWK:報告生成器,格式化文本輸出 awk [options] ‘program’ var=value file… awk [options] -f programfile var=value file… awk [options] 'BEGIN{ action;… } pattern{ acti ...
  • 參考資料: LVM詳解-駿馬金龍-博客園 How to reduce the size of an LVM partition formatted with xfs filesystem on CentOS7? 駿馬兄的博文會相對深入一點,並且他是基於ext系列文件系統來演示擴容與縮容,而我使用的是 ...
  • 轉載請註明出處。本圖來自北航電腦虛擬化課程ppt. ...
  • 在學習彙編的時候,會需要用到debug調試程式,但是現在win10預設已經移除了這個插件,我們需要手動安裝,下麵就告訴大家如何在win10環境下安裝debug。 1:準備工具 1.1 DOSBox 1.2 debug.exe 2:安裝過程 DOSBox安裝過程:可以在官方網站下載:https://w ...
  • 雲伺服器ESC 部署vsftpd 虛擬用戶 說明:雲伺服器部署和本地伺服器部署一樣,都需要開通指定的相應埠,只不過雲伺服器需要在安全組規則中打開相應的埠允許通過。 環境說明: 對應的用戶對應不同的密碼,對應不同的數據目錄,如下圖: 具體步驟 1) 安裝軟體 2) 創建相應的ftp數據目錄 3) ...
  • LVS
    LVS 概述.V1 LVS LVS lvs是一款開源的負責均衡調度器應用,工作於傳輸層。負責把客戶端請求按調度演算法轉發只後端伺服器集群中的主機進行響應。 LVS組成 LVS組成 ipvsadm:ipvsadm是工作於用戶工作,用戶通過ipvsadm工具定義lvs的工作機制,集群,規則以及演算法。 ip ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...