0

..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/、2番目の行からその行を削除しています。これは望ましくありません。/../いくつかの正規表現と見なされており、この正規表現と/ab/一致していることを理解しています。しかし、私はそれらだけ/../を交換したいです。

助けてください。

ありがとう、

NN

4

1 に答える 1

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代入で一重引用符または二重引用符のいずれかを使用でき、同じ結果が得られました。

Mac OS X 10.7.4 で標準sed(シェルは/bin/sh3.2.x bash) でテストしますが、結果はどのシステムでも同じです。

于 2012-09-13T06:24:57.983 に答える