自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 sed 命令進行復(fù)制、剪切和粘貼

系統(tǒng) Linux
了解 sed 的基本用法,然后下載我們的備忘單,方便快速地參考 Linux 流編輯器。

[[401126]]

了解 sed 的基本用法,然后下載我們的備忘單,方便快速地參考 Linux 流編輯器。

很少有 Unix 命令像 sed、grep 和 awk 一樣出名,它們經(jīng)常組合在一起,可能是因為它們具有奇怪的名稱和強大的文本解析能力。它們還在一些語法和邏輯上有相似之處。雖然它們都能用于文本解析,但都有其特殊性。本文研究 sed 命令,它是一個 流編輯器stream editor。

我之前寫過關(guān)于 sed 以及它的遠親 ed 的文章。要熟悉 sed,對 ed 有一點了解是有幫助的,因為這有助于你熟悉緩沖區(qū)的概念。本文假定你熟悉 sed 的基本知識,這意味著你至少已經(jīng)運行過經(jīng)典的 s/foo/bar 風(fēng)格的查找和替換命令。

安裝 sed

如果你使用的是 Linux、BSD 或 macOS,那么它們已經(jīng)安裝了 GNU 的或 BSD 的 sed。這些是原始 sed 命令的獨特重新實現(xiàn)。雖然它們很相似,但也有一些細微的差別。本文已經(jīng)在 Linux 和 NetBSD 版本上進行了測試,所以你可以使用你的計算機上找到的任何 sed,但是對于 BSD sed,你必須使用短選項(例如 -n 而不是 --quiet)。

GNU sed 通常被認為是功能最豐富的 sed,因此無論你是否運行 Linux,你可能都想要嘗試一下。如果在 Ports 樹中找不到 GNU sed(在非 Linux 系統(tǒng)上通常稱為 gsed),你可以從 GNU 網(wǎng)站 下載源代碼。 安裝 GNU sed 的好處是,你可以使用它的額外功能,但是如果需要可移植性,還可以限制它以遵守 sed 的 POSIX 規(guī)范。

MacOS 用戶可以在 MacPorts 或 Homebrew 上找到 GNU sed。

在 Windows 上,你可以通過 Chocolatey 來 安裝 GNU sed。

了解模式空間和保留空間

sed 一次只能處理一行。因為它沒有可視化模式,所以會創(chuàng)建一個 模式空間pattern space,這是一個內(nèi)存空間,其中包含來自輸入流的當(dāng)前行(刪除了尾部的任何換行符)。填充模式空間后,sed 將執(zhí)行你的指令。當(dāng)命令執(zhí)行完時,sed 將模式空間中的內(nèi)容打印到輸出流,默認是 標(biāo)準(zhǔn)輸出,但是可以將輸出重定向到文件,甚至使用 --in-place=.bak 選項重定向到同一文件。

然后,循環(huán)從下一個輸入行再次開始。

為了在遍歷文件時提供一點靈活性,sed 還提供了保留空間hold space(有時也稱為 保留緩沖區(qū)hold buffer),即 sed 內(nèi)存中為臨時數(shù)據(jù)存儲保留的空間。你可以將保留空間當(dāng)作剪貼板,實際上,這正是本文所演示的內(nèi)容:如何使用 sed 復(fù)制/剪切和粘貼。

首先,創(chuàng)建一個示例文本文件,其內(nèi)容如下:

  1. Line one
  2. Line three
  3. Line two

復(fù)制數(shù)據(jù)到保留空間

要將內(nèi)容放置在 sed 的保留空間,使用 h 或 H 命令。小寫的 h 告訴 sed 覆蓋保留空間中的當(dāng)前內(nèi)容,而大寫的 H 告訴 sed 將數(shù)據(jù)追加到保留空間中已經(jīng)存在的內(nèi)容之后。

單獨使用,什么都看不到:

  1. $ sed --quiet -e '/three/ h' example.txt
  2. $

--quiet(縮寫為 -n)選項禁止顯示所有輸出,但 sed 執(zhí)行了我的搜索需求。在這種情況下,sed 選擇包含字符串 three 的任何行,并將其復(fù)制到保留空間。我沒有告訴 sed 打印任何東西,所以沒有輸出。

從保留空間復(fù)制數(shù)據(jù)

要了解保留空間,你可以從保留空間復(fù)制內(nèi)容,然后使用 g 命令將其放入模式空間,觀察會發(fā)生什么:

  1. $ sed -n -e '/three/h' -e 'g;p' example.txt
  2.  
  3. Line three
  4. Line three

第一個空白行是因為當(dāng) sed 第一次復(fù)制內(nèi)容到模式空間時,保留空間為空。

接下來的兩行包含 Line three 是因為這是從第二行開始的保留空間。

該命令使用兩個唯一的腳本(-e)純粹是為了幫助提高可讀性和組織性。將步驟劃分為單獨的腳本可能會很有用,但是從技術(shù)上講,以下命令與一個腳本語句一樣有效:

  1. $ sed -n -e '/three/h ; g ; p' example.txt
  2.  
  3. Line three
  4. Line three

將數(shù)據(jù)追加到模式空間

G 命令會將一個換行符和保留空間的內(nèi)容添加到模式空間。

  1. $ sed -n -e '/three/h' -e 'G;p' example.txt
  2. Line one
  3.  
  4. Line three
  5. Line three
  6. Line two
  7. Line three

此輸出的前兩行同時包含模式空間(Line one)的內(nèi)容和空的保留空間。接下來的兩行與搜索文本(three)匹配,因此它既包含模式空間又包含保留空間。第三行的保留空間沒有變化,因此在模式空間(Line two)的末尾是保留空間(仍然是 Line three)。

用 sed 剪切和粘貼

現(xiàn)在你知道了如何將字符串從模式空間轉(zhuǎn)到保留空間并再次返回,你可以設(shè)計一個 sed 腳本來復(fù)制、刪除,然后在文檔中粘貼一行。例如,將示例文件的 Line three 挪至第三行,sed 可以解決這個問題:

  1. $ sed -n -e '/three/ h' -e '/three/ d' \
  2. -e '/two/ G;p' example.txt
  3. Line one
  4. Line two
  5. Line three
  • 第一個腳本找到包含字符串 three 的行,并將其從模式空間復(fù)制到保留空間,替換當(dāng)前保留空間中的任何內(nèi)容。
  • 第二個腳本刪除包含字符串 three 的任何行。這樣就完成了與文字處理器或文本編輯器中的 剪切 動作等效的功能。
  • 最后一個腳本找到包含字符串 two 的行,并將保留空間的內(nèi)容_追加_到模式空間,然后打印模式空間。

任務(wù)完成。

使用 sed 編寫腳本

再說一次,使用單獨的腳本語句純粹是為了視覺和心理上的簡單。剪切和粘貼命令作為一個腳本同樣有效:

  1. $ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
  2. Line one
  3. Line two
  4. Line three

它甚至可以寫在一個專門的腳本文件中:

  1. #!/usr/bin/sed -nf
  2.  
  3. /three/h
  4. /three/d
  5. /two/ G
  6. p

要運行該腳本,將其加入可執(zhí)行權(quán)限,然后用示例文件嘗試:

  1. $ chmod +x myscript.sed
  2. $ ./myscript.sed example.txt
  3. Line one
  4. Line two
  5. Line three

當(dāng)然,你需要解析的文本越可預(yù)測,則使用 sed 解決問題越容易。發(fā)明 sed 操作(例如復(fù)制和粘貼)的“配方”通常是不切實際的,因為觸發(fā)操作的條件可能因文件而異。但是,你對 sed 命令的使用越熟練,就越容易根據(jù)需要解析的輸入來設(shè)計復(fù)雜的動作。

重要的事情是識別不同的操作,了解 sed 何時移至下一行,并預(yù)測模式和保留空間包含的內(nèi)容。

下載備忘單

sed 很復(fù)雜。雖然它只有十幾個命令,但它靈活的語法和原生功能意味著它充滿了無限的潛力。為了充分利用 sed,我曾經(jīng)參考過一些巧妙的單行命令,但是直到我開始發(fā)明(有時是重新發(fā)明)自己的解決方案時,我才覺得自己真正開始學(xué)習(xí) sed 了 。如果你正在尋找命令提示和語法方面的有用技巧,下載我們的 sed 備忘單,然后開始一勞永逸地學(xué)習(xí) sed! 

 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2023-11-07 18:03:31

Vim復(fù)制粘貼

2020-10-17 09:03:06

使用JS創(chuàng)建復(fù)制&粘貼

2022-08-17 12:35:26

Linux sed編輯器

2019-07-12 14:00:55

xclipLinux命令行

2024-10-28 16:42:04

Linux編輯器sed 命令

2019-08-28 15:43:03

sed命令Linux

2011-12-29 09:51:27

程序員

2012-07-03 15:04:22

程序員

2020-10-11 13:35:00

Windows 10微軟粘貼

2023-07-03 22:35:50

Linux命令

2021-06-13 09:01:47

SedLinux命令

2018-07-03 13:17:00

2019-09-12 08:32:40

Linuxsed命令語法

2015-12-14 16:03:45

LinuxUnix端口掃描

2022-08-12 08:38:52

FFmpegLinux命令

2019-09-23 15:40:42

sedLinux命令

2022-12-16 21:24:26

微軟Windows 11

2021-09-21 15:28:33

LinuxSed智能引號

2016-12-14 09:32:49

FileChanne文件復(fù)制

2020-10-07 13:20:24

攻擊者
點贊
收藏

51CTO技術(shù)棧公眾號