1. 程式人生 > >shell檔案編輯工具,sed -i與ed的區別

shell檔案編輯工具,sed -i與ed的區別

著無聊,繼續答題
問題:GNU sed 提供了-i選項,為什麼有人說sed -i 並不象 ed 一樣真正的編輯檔案?(提示:觀察檔案改變前後的inode)

注意審題的話,這題是二個檔案編輯器的比較,
也有可能是提示的誤導,這題大都知道答-i 是用臨時檔案的機制,
但這道題如果不通過說明ed 的模式,再做sed -i 與ed 比較,
怎麼看都不算完整

======sed的基本模式======
sed是一種“流編輯器”,特點盡在‘流’字上,有進有出,流進來,編輯處理(基於二個space的cycle)完後,流出去,
因此不像awk具有BEGIN模組,可以不依賴輸入直接創造資料。sed程式一定要有輸入。
同時除非用-n遮蔽了輸出並且在cycle裡邊沒有輸出的動作,否則肯定也要有輸出。
。。。
sed -i的編輯模式:將原檔案rename成新檔名(tmpfile),以tmpfile為輸入,一行一行處理後,輸出儲存到檔案(與原檔案同名)
按行操作,這個也是流編輯器的特點之一
======ed===========
ed,這個以前沒用過,剛找男人問來的,今天閒著又翻了下原始碼看了下
ed的模式就是:scrach_file + line_buffer + command動作,
scrach_file是ed一開始呼叫標準tempfile函式建立的,tempfile在/tmp下以“程式名.隨機字尾”為名讀寫方式建立一個臨時檔案,並在程式時退出時刪除

  1. [[email protected] tmp]# file ed.b3db5b
  2. ed.b3db5b: ASCII text, with no line terminators
複製程式碼

臨時檔案儲存的是純資料(無行結束符),而line_buffer有點像“元資料”,是記憶體中的一個結構連結串列,一個節點一個行資訊,儲存各行起始位移和長度
ed file命令下會在執行ed時一開始便將檔案全部讀取,資料去除換行符後存放到臨時檔案,行資訊儲存在line_buffer裡,然後進行相關操作
ed裡的命令w將根據buffer裡的記錄資訊將資料全部儲存迴文件
ed對檔案的編輯,可以說是在記憶體裡儲存了一份檔案鏡象,通過w將資料從記憶體回寫到檔案
========比較=========

所以sed -i 跟ed是二種不同的檔案編輯模式,

從執行模式來區別:
sed -i是將檔案存重新命名為臨時檔案後做為輸入流,按行讀取進行cycle處理,輸出儲存到與原檔案同名的新空檔案裡。
後者是將檔案一次全部讀取,然後將資料存放到記憶體buffer和臨時檔案裡,處理完後再通過w命令回寫入檔案

從編輯對像來區別:
sed跟ed的單元動作都是以行資料為物件的,也程為行操作。不同在於
sed -i 的處理過程中,儲存在記憶體裡二個buffer的是部分行資料,可能是一行或多行資料
ed 處理過程中,儲存在記憶體裡的是所有的行資訊。

從inode來區別:用inode來區分二者的編輯模式,也是一種方法
由於sed把原檔案rename了,結果的檔案inode已經非原來的inode了
這種情況下,可以加入sed -c操作,保留檔案的inode不變了
-c是gnu sed 提供的,其他unix下的sed冒似不一定有(悲具的unix)

======================
這個題目出得有點讓人鬱悶,什麼叫“真正的編輯檔案”
真正的編輯檔案,比如c程式(不帶快取的檔案I/O)裡OPEN檔案後,直接根據描述符,對檔案進行讀寫
而sed -i 實際上是流處理,ed在處理過程中實際上是在編輯“臨時檔案”
事實上個人覺得sed -i 跟ed都不是“真正的編輯”檔案

相關推薦

shell檔案編輯工具sed -ied區別

著無聊,繼續答題問題:GNU sed 提供了-i選項,為什麼有人說sed -i 並不象 ed 一樣真正的編輯檔案?(提示:觀察檔案改變前後的inode)注意審題的話,這題是二個檔案編輯器的比較,也有可能是提示的誤導,這題大都知道答-i 是用臨時檔案的機制,但這道題如果不通過說

編寫一個檔案分割工具能把一個大檔案分割成多個小的檔案。並且能再次把它們合併起來得到完整的檔案

package wenjianyuliu;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io

編寫一個檔案分割工具能把一個大檔案分割成多個小的檔案。並且能再次把他們合併起來得到完整的檔案

package wenjian; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java

Shell學習(cutsedawksort)

cut cut的工作就是“剪”,具體的說就是在檔案中負責剪下資料用的。cut 命令從檔案的每一行剪下位元組、字元和欄位並將這些位元組、字元和欄位輸出。 選項引數 功能 -f 列號,提取第幾列

基於WEB的教職工健康檔案管理系統java設計開發

**基於WEB的教職工健康檔案管理系統,java設計與開發** 基於WEB的教職工健康檔案管理系統mysql資料庫建立語句 基於WEB的教職工健康檔案管理系統oracle資料庫建立語句 基於WEB的教職工健康檔案管理系統sqlserver資料庫建立語句 基於WEB的

多表查詢笛卡爾積 可視化工具pymysql查詢增刪改 sql 註水

增刪改 log .com cursor 執行 gin lar 模塊 內容 sql 註水import pymysqlconn=pymysql.connect(host=‘localhost‘,port=3306, db=‘db1‘,use

多表查詢笛卡爾積 視覺化工具pymysql查詢增刪改 sql 注水

sql 注水import pymysqlconn=pymysql.connect(host='localhost',port=3306, db='db1',user='user',password='root')cur=conn.cursor(cursors.DictCu

TexturePacker 檔案解釋工具方便分析動畫

解釋Texture Packer plist檔案,把大圖匯出成全部小圖。軟體介面展示較為簡單,方便好用匯出原圖的效果匯出切了空白的效果使用說明:(解釋Texture Packer匯出的plist檔案)開發用VS2017 C#桌面1.二進位制格式和文字格式的Plist檔案都可以

kotlin學習:valvar區別by lazylateinit區別

Kotlin中var和val的區別 Kotlin中有兩個關鍵字定義變數,這兩個關鍵字外形看著差別很小就只差了一個字母,但實際差別很大的。 var是一個可變【變數】,這是一個可以通過重新分配來更改為

python程序-守護程序原理-互斥鎖join區別-佇列-生產者消費者模式

1.守護程序    守護程序其實就是一個‘子程序’    守護=》伴隨        1.守護程序會伴隨主程序的程式碼執行完畢後而死掉        2.守護程序內無法再開啟子程序,否則丟擲異常2.為何用守護程序:    關鍵字就兩個:            程序:     

詳解Shell腳本:sed命令工具 awk命令工具

概念 roc 自動 剪切 一位數 工作 shadow 粘貼 amp -----------------------------概述----------------------------------- Linux文本處理工具(以下都是命令和工具,而且只是作為展示,不能作為

一個小坑: -bash: ./backup.sh: /bin/bash^M: bad interpreter: No such file or directory 由於shell指令碼檔案被我在Windows下編輯出現上面錯誤的原因之一是指令碼檔案是DOS格式的, 即每一行的行尾以\r\n來標識

    由於shell指令碼檔案被我在Windows下編輯過,出現上面錯誤的原因之一是指令碼檔案是DOS格式的, 即每一行的行尾以\r\n來標識, 使用vim編輯器開啟指令碼, 執行::set ff? 可以看到DOS或UNIX的字樣. 使用se

Linux基礎知識:SHELL指令碼;find查詢、tar壓縮;sed檔案處理工具

Shell指令碼程式設計基礎程式程式:演算法+資料結構資料:是程式的核心資料結構:資料在計算機中的型別和組織方式演算法:處理資料的方式程式程式設計風格:過程式:以指令為中心,資料服務於指令物件式:以資料為中心,指令服務於資料shell程式:提供了程式設計能力,解釋執行高階程式語言:編譯:高階語言

【FFMpeg視訊開發應用基礎】一、使用FFmpeg命令列工具和批處理指令碼進行簡單的音視訊檔案編輯

《FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK》視訊教程已經在“CSDN學院”上線,視訊中包含了從0開始逐行程式碼實現FFMpeg視訊開發的過程,歡迎觀看!連結地址:FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK

bstrong iem的區別

含義 html中 定義 部分 控制 情況 包含 鏈接 ron 1)b與strong的區別 b和strong標簽,在網頁中默認的情況下均是加粗字體的作用; b標簽是一個實體標簽,它所包含的字符將被設為blod粗體,是html語言中的;---視覺化 strong標簽是一個

關於Linux用戶權限文本處理工具正則表達式vim文本編輯

rtx 元字符 否則 權限 tdi 行編輯 directory e2fs 登錄 一、 用戶 ??在Linux系統中,可以創建多個用戶,每一個用戶都有一個與其對應的ID號,就像每一個人都有一個×××號一樣,這就是用戶的UID,??在Linux中管理員 root的默認UID

mac shell終端編輯命令行快捷鍵——行首行尾

它的 back 光標位置 lai ron ear 下一條 class 所有 Ctrl + d 刪除一個字符,相當於通常的Delete鍵(命令行若無所有字符,則相當於exit;處理多行標準輸入時也表示eof) Ctrl + h 退格刪除一個字符,相

GNU/Linux 正則表達式三劍俠(grepsedawk)(精)

重復 深入理解 不同的 原則 寬度 搜索命令 自定義 -o 排序 相關好文章推薦: shell命令行的解析原理(單雙無引號與字符及通配符的關系):http://www.cnblogs.com/f-ck-need-u/p/7426371.html 正則表達式裏是如何表達字符集

MySQL-讀取配置檔案工具測試

package JDBCUtil; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.ut

將Maven工程匯出war包(匯出可執行檔案) war包的安裝部署(以兩個Tomcat為例詳細)請到:

1  開啟war工程的pom.xml,將如下內容複製到配置Tomcat的程式碼中                 &l