[問題] sed為特殊字元加上跳脫字元問題

看板Linux作者 (0.0)時間2年前 (2022/03/08 11:50), 編輯推噓4(406)
留言10則, 4人參與, 最新討論串1/1
情境: 將文字檔裡的wireless ssid取出並sed到另外一個文字檔。 問題: 遇上包含/的ssid,sed指令會出事。 stackoverflow找到的解法: 放變數的時候用 ${ssid//\//\\/}在/前面加上escape。 問題1: match pattern是 /\/,看不懂第一個/的用途,實驗過用\/ 當pattern輸出結果也是一樣,這是為什麼呢? 實驗方式 ssid="TEST/SSID" echo ${ssid//\//\\/} echo ${ssid/\//\\/} 輸出都是TEST\/SSID 問題2: 取代的字串是\\/,就我的認知應該兩個都要加escape所以應該是\\\/ 實驗結果也是兩個輸出都一樣,why??? echo ${ssid//\//\\/} echo ${ssid//\//\\\/} -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.108.239 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1646711447.A.E67.html

03/08 12:33, 2年前 , 1F
參照 bash manpage 的 brace expansion
03/08 12:33, 1F

03/08 12:34, 2年前 , 2F
${var/pattern/string} 如果 pattern 是 / 開頭會替換所有
03/08 12:34, 2F

03/08 12:35, 2年前 , 3F
符合 pattern 的部分 反之只會替代第一個
03/08 12:35, 3F

03/08 12:35, 2年前 , 4F
所以你第一個只是因為你只有一個要替換所以沒差
03/08 12:35, 4F

03/08 13:09, 2年前 , 5F
至於第二個 因為後面的 / 本來就不會有特殊語意 所以沒差
03/08 13:09, 5F

03/08 13:10, 2年前 , 6F
然後 如第一行 這不是 sed
03/08 13:10, 6F

03/08 13:29, 2年前 , 7F
感謝 原來是Parameter Substitution的部分
03/08 13:29, 7F

03/08 18:18, 2年前 , 8F
把 sed 的分隔符號換掉就好了吧.
03/08 18:18, 8F

03/08 18:21, 2年前 , 9F
echo "ssid=1\2/3" | sed -e 's|ssid=||'
03/08 18:21, 9F

03/16 16:38, , 10F
sed可以換符號,不一定要斜線
03/16 16:38, 10F
文章代碼(AID): #1Y9jANvd (Linux)
文章代碼(AID): #1Y9jANvd (Linux)