我正在嘗試使用 sed 替換行,通常這可以正常作業,但我現在遇到一個似乎無法使用 sed 打球的字串 :(
檔案:test.py
$ cat test.py
BASE_DIR = os.path.expanduser("~/.teststring/")
我使用以下方法替換此行:
sed -i '/BASE_DIR = os.path.expanduser("~/.paddleocr/")/c\BASE_DIR = os.path.expanduser("/tmp/.teststring/")' test.py
我得到:
sed: -e expression #1, char 35: unknown command: `.'
不確定是什么原因造成的。我嘗試逃避.使用\.,但這也無濟于事:(
uj5u.com熱心網友回復:
使用sed 's/PATTERN/REPLACEMENT/',這是我建議的修改命令:
sed -i 's#\(BASE_DIR = os.path.expanduser("\)~/.teststring/\(")\)#\1/tmp.teststring/\2#' test.py.NEW
- 使用
's///'命令。 - 在 中
s///,該/字符可以替換為另一個字符,以避免混淆。就像在這種特殊情況下,您處理檔案和路徑,所以我喜歡使用#而不是分隔/符s///。因此s###。
圖案:\(BASE_DIR = os.path.expanduser("\)~/.teststring/\(")\)。它分為3個部分:
- 1)
\(BASE_DIR = os.path.expanduser("\)。這部分沒有改變,所以我把它封閉起來\(\)以便以后重用。不屬于模式的括號必須是“反斜杠”。 - 2)
~/.teststring/。這部分會改變,它是您想要從原始檔案中匹配的行的一部分。 - 3)
\(")\): 關閉雙引號和括號,這不會改變。封閉起來\(\)以備日后重用。
替換:\1\/tmp.teststring/\2。
- i)
\1是我“保存”以供以后在上面的 no1) 中重復使用的第一部分。 - ii)
/tmp.teststring/新案文取代上述 no2) 案文。 - iii)
\2是我“保存”的第二部分,供以后在上面的 no3) 中重復使用。
我無法理解的一個細節,您的 test.py 檔案使用 path "~/.teststring/",但您嘗試將其與"~/.paddleocr/". 我想那是一個錯誤?
uj5u.com熱心網友回復:
我認為你的第一個"應該是'
此外,您需要轉義\不屬于 sed 語法的部分,例如:
sed -i '/BASE_DIR = os.path.expanduser("~\/.paddleocr\/")/c\\BASE_DIR = os.path.expanduser("\/tmp\/.teststring/")' test.py
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439439.html
