【问题标题】:sed with special characters带有特殊字符的 sed
【发布时间】:2011-05-12 15:56:49
【问题描述】:

我想在这行上使用 sed:

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

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

ASD = $dsadad ( .cpp ) 

如何让 sed 忽略特殊字符,我尝试在特殊字符前添加反斜杠,但可能我弄错了,谁能给我举个例子?

这就是我想要的:

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

【问题讨论】:

  • ls | grep *.cpp 最好在 GNU Make 中写成 $(wildcard *.cpp),或者如果你真的坚持使用 ls (but don't),则写成 ls *.cpp

标签: linux bash unix sed


【解决方案1】:
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,否则会粘贴文件并且不会替换,你知道这是为什么吗?
【解决方案2】:

反斜杠工作正常。 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

【讨论】:

  • 但我也有 $ 和 ( 和 ) ,它们也是特殊字符吗?
  • sed 's/ASD = \$start (*\.cpp)/ASD = $dsadad (.cpp)/' somefile 不工作
  • 这个echo -n 'ASD = $start ( *.cpp )' | sed 's/\(.*\)start\(.*\)\*\(.*\)/\1dsadad\2\3/' 为我工作
  • @shd 你忘了第一个*的反斜杠。
  • -i 对文件中的替换进行 sed,即写入它们。如果没有 -i,sed 会写入标准输出。
【解决方案3】:

$,*,. 是正则表达式的特殊字符,因此需要对其进行转义才能按字面意思理解。

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

【讨论】:

  • 是的,左边是正则表达式,右边是字符串。在两边,perl 将执行变量插值。所以这实际上是我回答中的一个错误:perl 将用变量的值替换$dsadad$ 应该在两边都被转义。
  • 好的。我已经编辑了你的答案,所以没有那个错误。
  • 哦,等等,我在考虑 perl。 sed 不做变量。未转义的版本是可以的。修改后的版本也OK。 sed 主体周围的单引号将阻止 shell 替换任何变量,因此左侧的 $ 被转义只是为了防止其特殊的正则表达式含义。
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 2018-07-02
  • 2017-05-05
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多