使用 sed 替換帶有特殊字元的長文本

使用 sed 替換帶有特殊字元的長文本

我在 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

相關內容