[問題] 在windows下使用sed取代雙引號之問題

看板Linux作者 (Bad_To_The_Bone)時間13年前 (2012/10/08 16:31), 編輯推噓6(6015)
留言21則, 2人參與, 最新討論串1/1
大家好 小弟有個c的 rename.h檔 系統是winxp sp3 內容可能是 #define _MYFILENAME_STR "text.exe" 我想把他做成批次檔的變數 也就是 set _MYFILENAME_STR=text.exe 放入.bat檔以後供後續指令指定檔名時可用 由於裡面可能有多個\t(tab) 與" "(空白) 所以我想到的方式是 grep FILENAME_STR rename.h > 1.tmp -> 1.tmp 內容 --------------- #define MYFILENAME_STR "text.exe" --------------- sed s/\t//g 1.tmp > 2.tmp -> 2.tmp 內容 --------------- #define MYFILENAME_STR "text.exe" --------------- sed s/" "//g 2.tmp > 3.tmp -> 3.tmp 內容 --------------- #defineMYFILENAME_STR"text.exe" --------------- sed s/#define/"set "/g 3.tmp > 4.tmp -> 4.tmp 內容 --------------- set MYFILENAME_STR"text.exe" --------------- sed s/_STR\"/_STR=/g 4.tmp > 5.tmp -> 錯誤訊息如下 --------------- set MYFILENAME_STR=text.exe" sed: can't read >: Invalid argument sed: can't read 5.tmp: No such file or directory --------------- sed s/\"//g 5.tmp>out.bat -> 這步就沒做了 想請教一下這種狀況是什麼錯誤呢 感覺是雙引號的問題 但是我怎麼改都失敗 另外我想要不產生中間的tmp檔 改以使用| 該怎麼下指令給sed好呢 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.39.210.127 ※ 編輯: donkeychen 來自: 114.39.210.127 (10/08 16:32)

10/08 17:01, , 1F
試試 grep "FILENAME_STR" 檔名.h | 加上下面那一行
10/08 17:01, 1F

10/08 17:01, , 2F
awk '{print "set "$2"="$3}' | tr -d "\""
10/08 17:01, 2F

10/08 17:46, , 3F
可以耶 但是現在變成我要找怎麼把TR後的結果OUT到.BAT
10/08 17:46, 3F

10/08 17:46, , 4F
檔 我再研究一下 感謝
10/08 17:46, 4F

10/08 18:02, , 5F
再加上> 檔名.bat 就可以
10/08 18:02, 5F

10/08 19:53, , 6F
TR不給我 > 檔名 他好像把 > xxx.bat 當參數了
10/08 19:53, 6F

10/08 20:43, , 7F
請問你是在什麼平台用什麼軟體執行shell?
10/08 20:43, 7F

10/08 22:59, , 8F
WinXP 我.exe是網路上找到的 想說這問比較有人在用
10/08 22:59, 8F

10/08 23:02, , 9F
抱歉我貼一下
10/08 23:02, 9F
我上面敘述有稍微改一下 說明清楚我執行的環境 用了 rehon大大的作法 grep FILENAME_STR rename.h | awk '{print "set "$2"="$3}' -> 顯示 -------------------- set MYFILENAME_STR="text.exe" -------------------- grep FILENAME_STR rename.h | awk '{print "set "$2"="$3}'|tr -d "\"" -> 顯示為我想要的 -------------------- set MYFILENAME_STR=text.exe -------------------- grep FILENAME_STR rename.h | awk '{print "set "$2"="$3}'|tr -d "\"" >rename.bat -> 顯示 -------------------- tr: only one string may be given when deleting without squeezing repeats -------------------- ==================================================================== 我自己有試過用awk來改寫 grep FILENAME_STR rename.h | awk '{print "set "$2"="$3}'| awk 'BEGIN {FS="\""} {print $1 $2}' -> 顯示為我想要的 -------------------- set MYFILENAME_STR=text.exe -------------------- 但是 要>到檔案 grep FILENAME_STR rename.h | awk '{print "set "$2"="$3}'| awk 'BEGIN {FS="\""} {print $1 $2}' > rename.bat -> 顯示 --------------------- awk: input file ">": 系統找不到指定的檔案。 awk: input file "rename.bat": 系統找不到指定的檔案。 我目前作法是 寫一個rename.awk 內容為 --------- BEGIN { FS="\"" } { print $1 $2 } --------- 然後執行 grep FILENAME_STR rename.h | awk '{print "set " $2 "=" $3}'| awk -f rename.awk > rename.bat 這樣可行 但是好像不是很漂亮 .exe的來源 http://adidas.blog.51cto.com/ext/down_att.php?aid=13730&code=7766 http://adidas.blog.51cto.com/ext/down_att.php?aid=13727&code=1909 ※ 編輯: donkeychen 來自: 114.39.214.77 (10/08 23:38)

10/09 02:51, , 10F
你把tr -d "\"" 改為tr -d "\^"" 試試看
10/09 02:51, 10F

10/09 11:59, , 11F
|tr -d "\^"" > test.bat 還是 tr: too many arguments
10/09 11:59, 11F

10/09 12:02, , 13F
兩邊的tr.exe大小不同 但是--help都沒版本 說明好像一
10/09 12:02, 13F

10/09 12:02, , 14F
10/09 12:02, 14F

10/09 12:43, , 15F
那把tr -d "\""改為sed "s/\^"//g" 試試看
10/09 12:43, 15F

10/09 13:38, , 16F
sed "s/\^"//g" 去不掉雙引號 sed "s/\"//g" 可以
10/09 13:38, 16F

10/09 13:38, , 17F
但是依然不能 >到檔案 sed: can't read >: Invalid arg
10/09 13:38, 17F

10/09 13:39, , 18F
sed: can't read >: Invalid argument
10/09 13:39, 18F

10/09 14:18, , 19F
你把tr -d "\""改為tr -d \^" 試試看
10/09 14:18, 19F

10/14 04:26, , 20F
喔喔 有辦法 \x22 \x20 \x27 用ascii code就不會被
10/14 04:26, 20F

10/14 04:27, , 21F
弄混了 "\x22 \x20 \x27" 這樣就很容易看懂
10/14 04:27, 21F
文章代碼(AID): #1GSez4Du (Linux)