今天編寫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...