我在 unix 中使用 sed 將文件中的某些文字替換為特殊字元。我用谷歌搜尋並找到以下命令
sed 's/from/to/g' file.txt
這裡'from'是被替換的原始文本,'to'是替換文本
我試圖將其應用於包含特殊字元的長文字的文件,將“/D/dec/prog/g++.exe -Wall --std=c++0x”(不含引號)替換為“SYSTEM_PATH/BIN” ,我嘗試了以下方法,但它不起作用
sed 's//D/dec/prog/g++.exe -Wall --std=c++0x/SYSTEM_PATH/BIN/g' file.txt
但這會出現錯誤「sed:-e表達式#1,字元10:『s』的未知選項」。
我是unix初學者,但由於某種原因我需要遠端登入unix伺服器來處理一些檔案。我想知道
1)如何將 from 和 to 字串定義為變量,例如 FROMSTR = '/D/dec/prog/g++.exe -Wall --std=c++0x' TOSTR = 'SYSTEM_PATH/BIN'
所以我可以像 sed 's/$FROMSTR/$TO/g' file.txt 一樣呼叫 sed
但似乎 sed 不知道如何將其解釋為變量
2)用sed取代文字後,它不會將結果寫回原始檔案。如何讓它發揮作用?
答案1
替代命令不需要用作/
分隔符號。
sed 's!/D/dec/prog/g++.exe -Wall --std=c++0x!SYSTEM_PATH/BIN!g' file.txt
答案2
請按照問題中的說明進行操作:首先設定您擁有的內容以及將被替換的內容:
(base) localhost:~ # FROMSTR='/D/dec/prog/g++.exe -Wall --std=c++0x'
(base) localhost:~ # echo $FROMSTR
/D/dec/prog/g++.exe -Wall --std=c++0x
(base) localhost:~ # TOSTR='SYSTEM_PATH/BIN'
(base) localhost:~ # echo $TOSTR
SYSTEM_PATH/BIN
然後創建一個檔案來運行 sed。
(base) localhost:~ # cat > testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
然後運行 sed 呼叫變量,但對於第一個我們需要使用 echo:
(base) localhost:~ # sed -e "s|`echo $FROMSTR`|$TOSTR|" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2/D/dec/prog/g++.exe -Wall --std=c++0x2
3SYSTEM_PATH/BIN3
(base) localhost:~ # sed -e "s|$FROMSTR|$TOSTR|g" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
要使其發揮作用,需要注意以下幾點:
- 將 sed 分隔符號從我們習慣的 / 替換為 | 或您在兩個變數中任何一個中都沒有使用的內容。
- 如果您使用單引號 ',那麼變數將被讀取為名稱而不是其內容。 $TOSTR 將是 $TOSTR 而不是 SYSTEM_PATH/BIN。
- 使用雙引號能夠解釋變數。
如果你想讓 sed 重寫檔案並進行替換,那麼你必須將 -i 新增到 sed 選項,但建議使用 > 將輸出重定向到新檔案。
(base) localhost:~ # sed "s|$FROMSTR|$TOSTR|g" testSED > testSEDdone
(base) localhost:~ # cat testSEDdone
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
(base) localhost:~ # cat testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
(base) localhost:~ # sed -i "s|$FROMSTR|$TOSTR|g" testSED
(base) localhost:~ # cat testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3