替换主要由元字符组成的字符串

Replacing string consisting of mostly metacharacters

我有一个包含几十行格式的文件:

source ../foo/bar
source ../foo1/bar1
source ../foo2/bar2
etc

我一直困惑于使用 sed 找到 source ../foo/ 部分并将其替换为任何内容以将其删除。我一直在阅读 this very helpful post on the unix/linux Stack Exchange 关于转义元字符的内容,结果正则表达式是:

source \.\.\/\.\*?\/

按照该帖子的说明,我的完整 sed 如下所示:

sed -i 's/source \.\.\/\.\*?\///' TARGETFILE

命令完成且没有错误,但文件未受影响。我也试过:

sed -i 's/source \.\.\/\.\*?\//''/' TARGETFILE

我确定我是在假设某些东西或语法错误,但我相信你们中的许多人都能理解发现错误的难度。

谢谢。

sed -i 's+source \.*/[^/]*/++' TARGETFILE

删除任何前导点、斜杠、路径组件和斜杠。

使用 + 而不是 / 作为定界符可以更简单地匹配 /.

\.* 匹配一系列点。 [^/] 匹配除 /.

之外的任何内容
sed 's+source \.*/[^/]*/++' <<EXAMPLE
source ../foo/bar
source ..../baz/fop
source /buzz/this/that
EXAMPLE

结果

bar
fop
this/that

要删除那些具有模式 source ../.*/ 的行,您可以在 sed 中使用 d 命令:

sed -i.bak '\~source \.\./[^/]*/~d' file

使用grep你可以避免使用regex:

grep -vF 'source ../' file