sed - 如何忽略字符串中的许多特殊字符

问题描述:

我在一个大的shell脚本中有很多shell命令。我想评论他们中的许多人。对于如sed - 如何忽略字符串中的许多特殊字符

exec_cmd "mkdir -p $dockerHome/devicemapper/devicemapper" 

我能够用来替换此命令:

sed -i -e "s/exec_cmd \"mkdir \-p \$dockerHome\/devicemapper\/devicemapper\"/\#exec_cmd \"mkdir \-p \$dockerHome\/devicemapper\/devicemapper\"/g" check 

现在,有一个文件中像这样的命令数目不少。有没有办法写一个sed命令忽略所有的特殊字符一次,因为否则替代似乎是在要替换的字符串中的所有特殊字符前的反斜杠。

+0

你真的在文件中有上述内容吗?例如'exec_cmd“mkdir'? – jm666

+0

...因为如果是的话,你的'sed'命令'/ exec_cmd \“mkdir ...'将不起作用... – jm666

+1

...这是'LEFT DOUBLE QUOTATION MARK'与'U' + 201C')和'QUOTATION MARK'('U + 0022') – jm666

Perl来拯救。

quotemeta函数引用所有的元字符给你。

#! /usr/bin/perl -pl 
use warnings; 

BEGIN { 
    $regex = join '|', map quotemeta, split /\n/, << '__LIST__'; 
exec_cmd "mkdir -p $dockerHome/devicemapper/devicemapper" 
another command to be commented 
__LIST__ 

    $regex = qr/^($regex)$/; 
} 

s/$regex/$1 ? "# $1" : $_/e 

只需填写脚本行即可在__LIST__之前发表评论。保存到一个文件,运行如

perl script.pl input-file > output-file 

要直接编辑输入文件,你可以使用-i选项。