我必须从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
答案 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),但结果在任何系统上都是相同的