shell sed替換、刪除文件中的某個字符串 以及特殊字符

1、將當前目錄下包含hello串的文件中,hello字符串替換爲hi

sed -i "s/hello/hi/g" `grep "hello" -rl ./`

2、將某個文件中的hello字符串替換爲hi

sed -i "s/hello/hi/g" test.txt

3、刪除行首空格

sed -i 's/^ //g' test

4、刪除行尾空格

sed -i 's/ $//g' test

5 替換特定字符

#Echo “2006-11-21 22:16:30” | sed ‘s/-//g’ | sed ‘s/ //g’ | sed ‘s/://g’
得到的結果就是:20061121221630 

 

 

https://blog.csdn.net/qq_35180983/article/details/82936506

https://blog.csdn.net/zhan570556752/article/details/80515376  參考資料

 

形式    說明
${var}    變量本來的值
${var:-word}    如果變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值。
${var:=word}    如果變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word。
${var:?message}    如果變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標準錯誤輸出,可以用來檢測變量 var 是否可以被正常賦值。
若此替換出現在Shell腳本中,那麼腳本將停止運行。
${var:+word}    如果變量 var 被定義,那麼返回 word,但不改變 var 的值。
特殊替換——${var:-string},${var:+string},${var:=string},${var:?string}

      ①${var:-string}和${var:=string}:若變量var爲空,則用在命令行中用string來替換${var:-string},否則變量var不爲空時,則用變量var的值來替換${var:-string};不同之處是${var:=string}常用於判斷var是否賦值,沒有的話則給var賦上一個默認值。

      ② ${var:+string}:替換規則和上面的相反,即只有當var不是空的時候才替換成string,若var爲空時則不替換或者說是替換成變量 var的值,即空值。(因爲變量var此時爲空,所以這兩種說法是等價的) 

      ③${var:?string}:替換規則爲:若變量var不爲空,則用變量var的值來替換${var:?string};若變量var爲空,則把string輸出到標準錯誤中,並從腳本中退出。我們可利用此特性來檢查是否設置了變量的值。

注意:在上面這五種替換結構中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出。

模式匹配替換——${var%pattern},${var%%pattern},${var#pattern},${var##pattern}

# 是去掉左邊(在鍵盤上#在$之左邊);% 是去掉右邊(在鍵盤上%在$之右邊);#和%中的單一符號是最小匹配,兩個相同符號是最大匹配。

第一種模式:${variable%pattern}。shell在variable中查找,看它是否一給的模式pattern結尾,如果是,把variable去掉右邊最短的匹配模式

 第二種模式: ${variable%%pattern},這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,把variable中去掉右邊最長的匹配模式

第三種模式:${variable#pattern} 這種模式時,shell在variable中查找,看它是否一給的模式pattern開始,如果是,把variable中去掉左邊最短的匹配模式

 第四種模式: ${variable##pattern} 這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,把variable中去掉左邊最長的匹配模式

 這四種模式中都不會改變variable的值,其中,只有在pattern中使用了*匹配符號時,%和%%,#和##纔有區別。結構中的pattern支持通配符,*表示零個或多個任意字符,?表示僅與一個任意字符匹配,[...]表示匹配中括號裏面的字符,[!...]表示不匹配中括號裏面的字符。

[plain] view plain copy
# var=testcase      
# echo $var      
testcase      
# echo ${var%s*e}     
testca      
# echo $var      
testcase     
# echo ${var%%s*e}     
te    
# echo ${var#?e}      
stcase    
# echo ${var##?e}      
stcase    
# echo ${var##*e}      
    
# echo ${var##*s}      
e      
# echo ${var##test}      
case     
字符串提取和替換——${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
第一種模式:${var:num},shell在var中提取第num個字符到末尾的所有字符。若num爲正數,從左邊0處開始;若num爲負數,從右邊開始提取字串,但必須使用在冒號後面加空格或一個數字或整個num加上括號,如${var: -2}、${var:1-3}或${var:(-2)}。         

第二種模式:${var:num1:num2},num1是位置,num2是長度。表示從$var字符串的第$num1個位置開始提取長度爲$num2的子串。不能爲負數。

第三種模式:${var/pattern/pattern}表示將var字符串的第一個匹配的pattern替換爲另一個pattern。

第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換爲另一個pattern。

[plain] view plain copy
[root@centos ~]# var=/home/centos    
[root@centos ~]# echo $var    
/home/centos    
[root@centos ~]# echo ${var:5}    
/centos    
[root@centos ~]# echo ${var: -6}    
centos    
[root@centos ~]# echo ${var:(-6)}    
centos    
[root@centos ~]# echo ${var:1:4}    
home    
[root@centos ~]# echo ${var/o/h}    
/hhme/centos    
[root@centos ~]# echo ${var//o/h}    
/hhme/cenths    
對{}和()而言, 括號中的重定向符隻影響該條命令, 而括號外的重定向符影響到括號中的所有命令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章