[問題] grep檔案裡的特殊字元字串

看板Linux作者 (尋夢園)時間11年前 (2014/10/16 23:02), 11年前編輯推噓1(109)
留言10則, 3人參與, 最新討論串1/2 (看更多)
版友好 有個grep特殊字元的問題想請教 Q: 若想在檔案裡 搜尋特定字串如右 ~!@#$%^&*()_+ {}[]|\:";'<>?, /AZ 假設有一個隨機檔案data.txt內容是 AA="XXX223" BB=a132423davqef1 CC='OOOOOOOO' DD="~!@#$%^&*()_+ {}[]|\:";'<>?, /AZ" EE=e12eee eqwf 發現因為特殊字元的關係 ex: * [ 下面指令會出現問題 我試過 (雙引號) cat data.txt | grep "~!@#$%^&*()_+ {}[]|\:";'<>?, /AZ" => fail (雙引號, 特殊字元前面加\) cat data.txt | grep "~!@#$%^&\*()_+ {}\[]|\:\";\'<>?, /AZ" => fail (單引號) cat data.txt | grep '~!@#$%^&*()_+ {}[]|\:";'<>?, /AZ' => fail (為了解決單引號內 特殊字元'字元) cat data.txt | grep $'\'' => 可以找到' cat data.txt | grep $'~!@#$%^&\*()_+ {}\[]|' => 可以找到 cat data.txt | grep $'~!@#$%^&\*()_+ {}\[]|\' => 多了\, 就fail 目前用的shell是/bin/sh 不是bash 希望有遇過的版友 可以給一些建議 現在仍在嘗試解決中 若一有解答會回報給大家 感謝 ------------------------------------------------------- 今天試了板友的提示 環境是 ubuntu 10.04 / busybox v1.01 Ex: ~\!@#$%^&\*()\_+ {}\[\]|\\\:\";'<>?, /AZ` 當用grep ""(雙引號), 搜尋字串包括 ! * [ ` " \ 等字元, 將無法搜尋, sol: 這些特殊字元前面需要加上\或\\ 特別的是字元 " ` 前面加上\\有問題, 字元 \ 前面需要加上兩個\\, ex: \=>\\\ (反斜線的雙重escape) ex: cat data.txt |grep "~\!@#$%^&\*()_+ {}\[]|\\\:\";'<>?, /AZ" 若用grep ''(單引號), 搜尋字串包括 * [ ' \ 等字元, 將無法搜尋, sol: 這些特殊字元前面需要加上\, (但不能加上兩個\) 特別的是字元 ' 前面需要加上'"'", ex: ' => '"'"' ex: cat data.txt |grep '~!@#$%^&\*()_+ {}\[]|\\:";'"'"'<>?, /AZ' 若用grep $'\x27'繼續延伸找結果, 則是busybox不支援該語法 以上是自己測試的結果 謝謝版友幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.103.132 ※ 文章網址: http://www.ptt.cc/bbs/Linux/M.1413471770.A.A69.html

10/16 23:48, , 1F
grep "~\!@#$%^&\*()_+ {}\[\]\||\\\:\";'<>?, /AZ"
10/16 23:48, 1F

10/16 23:50, , 2F
順帶一提這是bash下測的,會讓他變regex的都要esc掉
10/16 23:50, 2F

10/16 23:51, , 3F
hmmm...\[\]應該可以寫成\[]
10/16 23:51, 3F

10/17 00:00, , 4F
請使用 grep -F 就不會支援 regexp 了
10/17 00:00, 4F

10/17 00:04, , 5F
好招,不過你中間的"跟一開始的!還是要讓他跳掉
10/17 00:04, 5F

10/17 00:18, , 6F
謝謝樓上兩位回覆 明天回工作崗位在板子環境上做確認 感謝
10/17 00:18, 6F

10/17 00:21, , 7F
一般來說字串用單引號包起來,裡面的字元就不需要跳脫
10/17 00:21, 7F

10/17 00:23, , 8F
不過內容還有 ' 就需要另外考慮就是,所以看情況變化
10/17 00:23, 8F

10/17 00:27, , 9F
! 符號一般是 history 內項目,一般來說若暫時需要關閉
10/17 00:27, 9F

10/17 00:27, , 10F
set +o histexpand 就可以避免單純用 ! 符號引起問題
10/17 00:27, 10F
※ 編輯: thisgo (111.243.107.53), 10/17/2014 22:56:48
文章代碼(AID): #1KFzuQff (Linux)
文章代碼(AID): #1KFzuQff (Linux)