我正在尝试使用 sed 和 perl 在几个文件中用空字符串替换 ^[(s3B 。
s/^[(s3B// 虽然不起作用,所以我想知道我还能尝试什么。
您需要引用特殊字符:
$ echo "^[(s3B AAA ^[(s3B"|sed 's/\^\[[(]s3B//g'
AAA
$ echo "^[(s3B AAA ^[(s3B" >file.txt
$ perl -p -i -e 's/\^\[[(]s3B//g' file.txt
$ cat file.txt
AAA
如果您正在处理 ANSI 序列(xterm 颜色序列、转义序列),那么 ^[ 不是 '^' 后跟 '[' 而是一个不可打印的字符 ESC,ASCII 码 0x1B。
要将该字符放入 sed 表达式中,您需要在 GNU sed 中使用 \x1B,或参见http://www.cyberciti.biz/faq/unix-linux-sed-ascii-control-codes-nonprintable/ 。您还可以在 Bash 行编辑中使用 ctrl+v 将特殊字符直接插入命令行。
问题是有几个字符在正则表达式中有特殊含义。^
是一个行首锚点,[
打开一个字符类,并(
打开一个捕获。
您可以通过在 Perl 字符串前面加上 来转义所有非字母数字\Q
,因此您可以安全地使用
s/\Q^[(s3B//
这相当于,并且比
s/\^\[\(s3B//
在正则表达式中,“^”、“[”和“(”(以及许多其他字符)是用于特殊正则表达式功能的特殊字符,如果您引用这些字符本身,您应该在它们前面加上“\”。正确的替换reges 将是:
$string =~ s/\^\[\(3B//g
如果你想替换所有的出现。