sed 處理替換字元中的特殊字元

2021-07-22 13:21:58 字數 1910 閱讀 2549

今天編寫shell程式時遇到了乙個關於sed命令的問題。問題簡化如下。

文字檔案1.txt中包含字串[:50]

~/documents/books/linux/test$:cat 1.txt 

[:50]

願意想將[:50]替換為[50:100],指令碼如下:
~/documents/books/linux/test$:cat test.sh 

#!/bin/bash

oldstr="[:50]"

newstr="[50:100]"

cat 1.txt | sed -n 's/$oldstr/$newstr/p'

執行./test.sh,結果沒有輸出
~/documents/books/linux/test$:./test.sh 

~/documents/books/linux/test$:

於是,我上網查詢問題原因,

1,如何在sed裡使用變數的問題,

發現原來是雙引號和單引號引用的區別。

單引號:

shell

處理命令時,對其中的內容不做任何處理。即此時是引號內的內容是

sed命令所定義的格式。

雙引號:

shell

處理命令時,要對其中的內容進行算術擴充套件。如果想讓

shell

擴充套件後得到

sed命令所要的格式

下面是個簡單的例子

~/documents/books/linux/test$:name=chen

~/documents/books/linux/test$:echo '$name'    # $當作字元處理

$name

~/documents/books/linux/test$:echo "$name"    # $作為特殊字元處理

chen

網上總結了四種方案

1. eval sed 's/$a/$b/' filename 2.

sed "s/$a/$b/" filename 3.

sed 's/'$a'/'$b'/' filename 4.

sed s/$a/$b/ filename

於是我將指令碼中sed中的單引號改為雙引號。

#!/bin/bash

oldstr="[:50]"

newstr="[50:100]"

cat 1.txt | sed -n "s/$oldstr/$newstr/p"

但是輸出的結果卻跟預想的不一樣。結果如下:
~/documents/books/linux/test$:./test.sh 

[[50:100]50]

仔細一下,應該跟sed中的正規表示式有關:

正規表示式認可的特殊字元有:

. * [ ] ^ $ \ + ? | ( )

這些特殊字元中的乙個作為文字字元,需要在特殊字元前新增反斜槓字元\ 來轉義它。

得到之前的結果是因為sed中的正規表示式[:50]表示第乙個匹配: , 5,0任一字元用[50:100]進行替換。字串[:50]第乙個匹配的是:,所以得到[[50:100]50].所以我將oldstr中的進行轉義,並且在sed命令選項中加上g進行完全替換。

#!/bin/bash

oldstr="\[:50\]"

newstr="[50:100]"

cat 1.txt | sed -n "s/$oldstr/$newstr/g;p"

則得到我想要的結果:

~/documents/books/linux/test$:./test.sh 

[50:100]

問題解決完畢。

sed 字元替換命令

sed 是一種幾乎包括在所有 unix 平台 包括 linux 的輕量級流編輯器。sed 主要是用來將資料進行選取 替換 刪除 新增的命令。sed 選項 動作 檔名 root localhost sed 2p student.txt 沒有 n 選項輸出所有內容,而且會重複,2p 代表列印第二行 id...

替換 恢復Html中的特殊字元

public static string htmlencode string thestring 第一段是轉換textarea裡面的特殊字元的,用處是 比如在做網頁的時候,提供了乙個textarea框給使用者,讓使用者輸入乙個自我簡介什麼的,然後儲存到資料庫裡,在儲存到庫里以前要做一下這樣的轉換,為...

sed 字串替換

1.sed替換的基本語法為 sed s 原字串 替換字串 單引號裡面,s表示替換,三根斜線中間是替換的樣式,特殊字元需要使用反斜線 進行轉義。2.單引號 是沒有辦法用反斜線 轉義的,這時候只要把命令中的單引號改為雙引號就行了,格式如下 要處理的字元包含單引號 sed s 原字串包含 替換字串包含 3...