2012-09-13 104 views
0

我必須從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

回答

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 
$ 

注意在echo命令謹慎使用雙引號的變量"$x"左右。我可以在作業中使用單引號或雙引號,並得到相同的結果。

在標準的sed(外殼爲/bin/sh,又名bash 3.2.x)的Mac OS X 10.7.4上測試,但結果在任何系統上都是一樣的。

+0

這不符合要求。它也刪除了我不想要的「/ tx /」。我只想要該序列「/../」應該替換爲「/」。 – Niranjan

+0

@Niranjan:你在'sed'腳本中使用單引號還是雙引號?它們不可互換 - 至少,不是在這方面。或者你還沒有使用任何引號?如果你不使用單引號,你必須使用更多的反斜槓。根據經驗,除非需要插入shell變量,否則將'sed'腳本括在單引號中。 –

+0

得到了點喬納森。我根本沒有在SED命令中使用任何引號。你的建議是建議使用單引號。單引號'sed -e'%/ \。\ ./%/% g'$ {SRC_FILE}> $ {TEMP_FILE}'解決了這個問題。感謝你的幫助。非常感謝你。 – Niranjan