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/"
匹配。我猜这是一个错误?
我正在尝试使用 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/"
匹配。我猜这是一个错误?