使用特殊字符的sed

13

我有这一行代码想要使用sed:

--> ASD = $start ( *.cpp ) <--

如果$start不是一个变量,我想在其上使用sed,并将所有这一行替换为:

ASD = $dsadad ( .cpp ) 

我怎样才能让sed忽略特殊字符?我尝试在特殊字符前添加反斜杠,但可能做错了,有人能给我展示一个例子吗?

以下是我的要求:

sed 's/CPPS = \$(shell ls | grep \*\.cpp )/somereplace/' Makefile

在GNU Make中,“ls | grep *.cpp”最好写成“$(wildcard *.cpp)”,或者如果你真的坚持使用“ls”的话,就写成“ls *.cpp”(但不建议这样做)。 - tripleee
4个回答

7
sed 's/\$start/\$dsadad/g' your_file
>> ASD = $dsadad ( *.cpp ) 

sed 's/\*//g' your_file
>> ASD = $start ( .cpp ) 

为了遵循您的编辑:

sed -i 's/ASD = \$start ( \*.cpp )/ASD = \$dsadad ( .cpp )/' somefile
>> ASD = $dsadad ( .cpp )

在命令中添加-i(--inplace)以编辑输入文件。


这是正确的,但我需要添加-i,否则它会粘贴文件而不是替换,你知道为什么吗? - shd

4

反斜杠可以正常使用。 echo '*.cpp' | sed 's/\*//' => .cpp

如果您在Shell中,可能需要双重转义$,因为它既是Shell的特殊字符(变量扩展),也是sed的特殊字符(行末)。

echo '$.cpp' | sed "s/\\$//" 或者 echo '$.cpp' | sed 's/\$//' => '.cpp'

不要转义();这实际上会使它们在sed中成为特殊字符(组)。其他一些常见的字符包括[ ] \ . ?

这是如何转义您的示例:

sed 's/ASD = \$start ( \*\.cpp )/ASD = $dsadad ( .cpp )/' somefile

但是我还有 $ 、( 和 ) ,它们也是特殊字符吗? - shd
sed 's/ASD = $start ( *.cpp )/ASD = $dsadad ( .cpp )/' somefile 无法工作 - shd
这个 echo -n 'ASD = $start ( *.cpp )' | sed 's/\(.*\)start\(.*\)\*\(.*\)/\1dsadad\2\3/' 对我有效。 - pconcepcion
@shd,你在第一个 * 前面忘记加反斜杠了。 - sapht
-i 参数让 sed 直接在文件中进行替换,即写入文件。如果没有 -i 参数,sed 将会输出到标准输出。 - sapht
在我的情况下,我应该转义双引号 " 而不是 <_ 和 _>echo '<table>, atablesir' | sed "s/<table>/<table class=\"table table-striped\">/g" - bcag2

1

$*.这些字符在正则表达式中是特殊的,因此需要转义才能被当做文本匹配。

sed 's/ASD = \$start ( \*\.cpp )/ASD = \$dsadad ( .cpp )/' somefile

是的,左边是一个正则表达式,右边是一个字符串。在两侧,Perl将执行变量插值。所以这实际上是我的答案中的一个错误:Perl将用变量的值替换$dsadad$在两侧都应该被转义。 - glenn jackman
1
好的。我已经编辑了你的答案,没有那个错误了。 - ArtOfWarfare
1
哦,等等,我想错了,我在想Perl。Sed不支持变量。未转义的版本可以使用。编辑后的版本也可以使用。单引号将sed主体括起来,将阻止* shell *替换任何变量,因此左侧的$仅被转义以防止其特殊的正则表达式含义。 - glenn jackman

0

我有一个使用案例,需要用变量替换文本,该变量包含特殊符号,例如(xyz-compute@developer.gserviceaccount.com)。这个@符号会导致问题。所以我发现这个解决方案很有用。

SERVICE_ACCOUNT="xyz-compute@developer.gserviceaccount.com"
sed -i 's/DEVOPS_SERVICE_ACCOUNT/'${SERVICE_ACCOUNT}'/g' file.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接