sed 通过转义特殊字符替换行

sed replace line by escaping special chars

我正在尝试使用 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: `.'

不确定是什么原因造成的。我尝试使用 \. 转义 . 但这也无济于事:(

我认为你的第一个 " 应该是 '

此外,您需要转义不属于 sed 语法的 \,例如:

sed -i '/BASE_DIR = os.path.expanduser("~\/.paddleocr\/")/c\BASE_DIR = os.path.expanduser("\/tmp\/.teststring/")' test.py

使用sed 's/PATTERN/REPLACEMENT/',这是我建议的修改命令:

sed -i 's#\(BASE_DIR = os.path.expanduser("\)~/.teststring/\(")\)#/tmp.teststring/#' test.py.NEW
  • 使用 's///' 命令。
  • s///中,/字符可以用另一个字符代替,以免混淆。就像在这种特殊情况下一样,您处理文件和路径,所以我喜欢使用 # 而不是 / 作为 s/// 分隔符。因此 s###.

模式:\(BASE_DIR = os.path.expanduser("\)~/.teststring/\(")\)。它分为 3 个部分:

  • 1) \(BASE_DIR = os.path.expanduser("\)。这部分没有改变,所以我将它包含在 \(\) 中以备后用。不属于模式的括号必须“反斜杠”。
  • 2) ~/.teststring/。这部分会改变,它是你想要从原始文件匹配的行的一部分。
  • 3) \(")\):关闭 double-quote 和括号,这个不会改变。附在 \(\) 中以供日后重用。

替换:\/tmp.teststring/.

  • i) </code> 是我“保存”的第一部分,供以后在上面的 no1) 中重复使用。</li> <li> ii) <code>/tmp.teststring/ 替换上面 2) 中的文本的新文本。
  • iii) </code> 是我“保存”的第二部分,以便以后在上面的 3) 中重复使用。</li> </ul> <hr /> <p>一个细节我无法理解,您的 test.py 文件使用路径 <code>"~/.teststring/",但您试图将其与 "~/.paddleocr/" 匹配。我猜这是一个错误?