如何在bash脚本中替换..来自字符串?

时间:2012-09-13 06:16:34

标签: bash

我必须从Bash脚本中的文件中删除..个字符。例如:

我有一些字符串:

some/../path/to/file
some/ab/path/to/file

更换后,它应该看起来像

some/path/to/file
some/ab/path/to/file

我使用了以下代码

DUMMY_STRING=/../
TEMP_FILE=./temp.txt
sed s%${DUMMY_STRING}%/%g ${SRC_FILE} > ${TEMP_FILE}
cp ${TEMP_FILE} ${SRC_FILE}

它正在替换第1行中的/../;但它也从第二行删除了行/ab/。这是不希望的。我理解它正在考虑/../,因为一些正则表达式和/ab/匹配此正则表达式。但是我只想要替换那些/../

请提供一些帮助。

谢谢,

NN

1 个答案:

答案 0 :(得分:3)

.sed中的元字符,表示“任何字符”。要抑制其特殊含义,请使用反斜杠转义它:

sed -e 's%/\.\./%/%g' $src_file > $temp_file

请注意,在消除/../后,您指的是不同的文件。要引用与以前相同的名称(在没有符号链接的情况下,这会使事情复杂化),您需要在/../之前删除目录组件。因此:

some/../path/to/file
path/to/file

引用相同的文件,假设some是一个目录而不是其他地方的符号链接,但一般来说,some/path/to/file是一个不同的文件(尽管可以使用符号链接来混淆该断言)。


$ x="some/../path/to/file
> some/ab/path/to/file
> /some/path/../to/another/../file"
$ echo "$x"
some/../path/to/file
some/ab/path/to/file
/some/path/../to/another/../file
$ echo "$x" | sed -e 's%/\.\./%/%g'
some/path/to/file
some/ab/path/to/file
/some/path/to/another/file
$ echo "$x" | sed -e "s%/\.\./%/%g"
some/path/to/file
some/ab/path/to/file
/some/path/to/another/file
$ echo "$x" | sed -e s%/\.\./%/%g
some/path/file
some/path/file
/some/path/to/another/file
$ echo "$x" | sed -e s%/\\.\\./%/%g
some/path/to/file
some/ab/path/to/file
/some/path/to/another/file
$

请注意在"$x"命令中谨慎使用变量echo周围的双引号。我可以在赋值中使用单引号或双引号,并且会得到相同的结果。

使用标准sed在Mac OS X 10.7.4上进行测试(shell为/bin/sh,又称bash 3.2.x),但结果在任何系统上都是相同的