[Shell Script]存檔遇到星號(asterisk sign)問題

  • 787
  • 0

摘要:[Shell Script]存檔遇到星號(asterisk sign)問題

延續前幾篇的存檔問題,

使用替換特定行幾乎解決了所有特殊符號存檔時的問題(取代原本搜尋文字並取代的方法)。

然而遇到星號(*)又有問題了!

 

情境如下:

使用者輸入他的暱稱,而他的暱稱可能是任何特殊符號。(有些人會用表情符號當暱稱,像是*^_^*)

將使用者輸入的資料存在暱稱的資料欄位(假設是固定第二行)。

 

這邊要注意,如果是用HTTP Request(POST或GET),傳送資訊前就要做處理了!

假如是用Javascript或jQuery,

傳送的parameter可以這樣做處理:

將*取代成%2A。


<script type="text/javascript">	
$(function(){
        $("#btnSubmit").click(function(){
            $.ajax({
                url: "setInfo.cgi",
                type: "GET",
		 data: {
			 nickname: $("#nickname").val().replace(/\*/g,'%2A')
		 },
		 dataType: "json",
		 error: function(){
			 alert("Something is wrong!");
		 },
		 success: function(data){
			 alert(data.MSG);
		 }
	     });
        });
});
</script>
<body>
	<input type="text" id="nickname" /><input type="button" value="Submit" id="btnSubmit" />
</body>

 

也就是關鍵的這一句:$("#nickname").val().replace(/\*/g,'%2A')

以往的replace只會取代關鍵字一次,那麼*^_^*就只會變成%2A^_^*

replace搭配regex後就可以變成%2A^_^%2A了。

因此在儲存暱稱的部分,

setInfo.cgi

就可以這麼做(以GET為例):


query=$(echo "$QUERY_STRING")
NickName=$(echo $query | awk -F'nickname' '{print $2}' | awk -F'&' '{print $1}' | awk -F'=' '{print $2}')
#假如網頁把&編碼成%3B
test=$(echo "$NickName" | awk -F'%3B' '{print $1}')
#網頁可能把%做編碼,所以本來的%2A會變成%252A,因為%編碼會變成%25。
#所以這麼做是要把%25還原成%,test2才是我們要的*轉成%2A的結果
test2=$(echo $test | sed -e "s/%25/%/g")
#最後將%2A再還原成*並用escape因此是\*
newNickName=$(echo $test2 | sed -e 's|%2A|\*|g')

到此就可以用我們之前說的找行數做取代。

然而卻沒那麼簡單,

因為我們原本的方法會找oldLine,假如oldLine已經有*號了(自己手動用vi修改檔案做測試的話),

那麼如果有兩個以上的星號,就會出問題!

因此這次的找行要改成不在乎原來內容的版本!

 

也就是這樣:


sed -i "$File" -e "2s/.*/$newNickName/g"

 

關鍵就是原本的$oldLine部分改成.*,就是不在乎原本內容是什麼。

 

到此,總算是把特殊符號的存檔問題補完了。

 

希望這樣做是目前最完美解~

畢竟我們永遠無法確定字串搜尋部分遇到特殊字元會有什麼樣的結果呀......