1. 程式人生 > >sed 處理替換字元中的特殊字元

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

今天編寫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 處理替換字元特殊字元

今天編寫shell程式時遇到了一個關於sed命令的問題。問題簡化如下。 文字檔案1.txt中包含字串[:50] ~/Documents/books/linux/test$:cat 1.txt [:50] 願意想將[:50]替換為[50:100],指令碼如下:~/Docu

MySql模糊查詢特殊字元處理

MySql的LIKE查詢語句中,有一些特殊的字元,需要轉換後才能搜尋到結果: ':用於包裹搜尋條件,需轉為\'; %:用於代替任意數目的任意字元,需轉換為\%; _:用於代替一個任意字元,需轉換為\_; \:轉義符號,需轉換為\\\\。 以下是一些匹配的舉例。 SELECT * FROM `table`

前後臺互動特殊字元處理

一、特殊字元需要做處理1. 單引號    後臺返回的json中包含單引號,可能會引起前端頁面js報錯,可以在前端對單引號進行轉義,或者在後臺進行轉義,再生成json返回到前端。    後臺根據前端傳遞的資料拼接sql時,單引號會導致sql語句報錯,且不推薦直接使用字串進行sq

url特殊字元被轉義成編碼後如何處理

開發時有時服務端返回的json中包含url,url中可能含有一些特殊字元,這些特殊字元在傳輸的過程中可能會被轉義成編碼。這時候我們拿到手裡要如何轉換回去呢,先看下那些字元可能會被編碼 例: String url = "http://www.baidu.c

mybatis xml特殊字元處理

出處:http://yaobenzhang.blog.163.com/blog/static/214395113201561523017861/ 1,CDATA區: 它的全稱為character data,以"<![CDATA[ "開始,以" ]]>"

URI 特殊字元處理

一、問題闡述   今天寫 url 請求時,不管是get 請求還是 post 請求,如果引數中帶有 + % # 等特殊符號,就無法正常獲得引數   具體現象就是 用URL傳引數的時候,用&符號連線,如果某一個引數中含"#$ ^ & * + ="這些符號的時候,在另一個頁面

科大訊飛語音識別時字串特殊字元處理

比如口算遊戲: 訊飛會返回:請回答[n2]78+11=? 此時我們要去掉[n2] 可做如下操作 String results = "[n2]78+11=?"; results = results.replaceAll("\\[" + "n2" + "\\]", "");

URL特殊字元(+?%#&=/)的處理

在url中直接使用一些特殊字元,在伺服器端接收的時候經常出現數據丟失的情況。 那麼哪些字元能夠直接被伺服器識別,哪些有不能呢? 字元“a-z”,”A-Z”,”0-9”,”.”,”-“,”_”,”*”

iOS的Url特殊字元的轉碼處理

今天在寫程式碼時遇到一個問題,跟伺服器請求唯一的註冊碼時,後需提交資料報錯,後來發現是註冊碼中有特殊字元,雖然POST的資料已經轉碼過,但是仍然有問題 解決方式:NSString *UrlEncodedString(NSString *sourceText) {

encodeURIComponent 處理URL特殊字元

url引數中特殊字元(如中文,”&”,”/”等)的處理,這些符號需要先經過編碼處理再傳遞到後臺,後臺解碼得到字串 方法1:使用encodeURIComponent()函式引數兩次編碼如下

xml檔案特殊字元轉義

在使用mybatis/ibatis寫sql時總是忘記特殊轉義表示,在此記錄 左邊為xml特殊符號,右邊是轉義 <     &lt;>     &gt;&   &

C語言特殊字元含義

字元 中文 英文 說明  \n  換行符  newline     \t    

判斷一個數字(字串)特殊字元的出現次數

第一種方法: (將數字轉化為字串,再)將字串分割為陣列,迴圈判斷陣列的每一項是否為這個字元(以‘1’為例) function patch(num){ var s=num.toString(); var arr = s.spl

Markdown特殊字元的轉義字元

上次在用Markdown記筆記時,當正文中寫到<PROJECT>_<PATH>_<FILE>_H_時,<>裡的內容顯示顯示不出來,就算用' '也顯示不出來。後想起Markdown支援html語法,這樣的寫法(<>或<\>)與html語法衝

處理string物件字元

一、字元操作函式 在cctype標頭檔案中定義了一組標準庫函式處理字元。 下列的函式從屬於名稱空間std。 1、isalnum(c)  當c是字母或數字時為真。 2、isalpha(c)  當c是字母時為真。 3、iscntrl(c)  當c是控制字元時為真。 4、isdigit(c)  當c是數

php去除陣列或字串特殊字元

去除陣列或是字串中的反斜槓 function stripslashes_deep($value) { $value = is_array($value) ? array_map('stripslashes_deep', $value) :

網址URL特殊字元轉義

字元  URL編碼 空格   %20 &        %26 %       %25 :         %3A |         %7C 分析: %253A == %3A == : %257C == % 7C == | %2520 == %20 == 空格

python 替換字串字元

import os import re ls = [] lr = [] r = re.compile(r'\jackliu\\') # path = r"C:\Users\jackliu\Deskt

Java處理正則表示式特殊字元轉義

正則需要轉義字元:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|' 異常現象: java.util.regex.PatternSyntaxException: Dangling

python替換word字元

需要安裝模組,win32com 下載地址:http://download.csdn.NET/detail/clean_water/9759816 import win32com.client