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

时间:2015-01-05 21:52:10

标签: bash sed

我的文件包含以下格式的几十行:

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

我确定我正在对某些事情或语法错误做出假设,但我相信很多人都会发现很难发现错误。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

使用+代替/作为分隔符,可以更轻松地匹配/

\.*匹配一系列点。 [^/]匹配/以外的任何内容。

sed 's+source \.*/[^/]*/++' <<EXAMPLE
source ../foo/bar
source ..../baz/fop
source /buzz/this/that
EXAMPLE

结果

bar
fop
this/that

答案 1 :(得分:1)

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

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

使用grep,您可以避免使用regex

grep -vF 'source ../' file