パスを修正

パスを修正

$var変数()に格納されているパスを変更してこれを実行しようとしていますsed。実際、$(dirname "$var")スクリプトの目的に関連した理由で置き換えを行う必要があります。

これの例は、交換するパスが複数含まれている場合varです。パスは任意の場所にあります(1つは行の真ん中近く、もう1つは行の先頭など)。以下に例を示します。var=/dir/dir xyz/file.txtfilenamefilename

dog foo/bar /dir/dir xyz/file.txt
a b c d /dir/dir xyz/file.txt x y z
/dir/dir xyz/file.txt 1234
{[(/dir/dir xyz/file.txt

私が望むもの

dog foo/bar .
a b c d . x y z
. 1234
{[(.

私は次を試しました

sed "s|"$(dirname "$var")"|.|g" "$filename"

得るsed: -e expression #1, char 31: unterminated `s' command

助けてください?もちろん、これに加えて他の方法を提案することもできますsed

答え1

存在する:

sed "s|"$(dirname "$var")"|.|g" "$filename"

引用符で囲まれているがs|引用符内にないため、分割+グローブの影響を受けます。|.|g$(dirname "$var")

sed -e "s|$(dirname -- "$var")|.|g" -- "$filename"

--この問題を解決することができますが(欠けているsも追加されます)、inの左側が正規表現として解釈されるため、まだ間違っています。ではありません)。ファイル名が保証されます)。s/lhs/rhs/flagssed$var|sed

たとえば、.同様にすべての文字と一致します.

以下を行う必要があります。

DIR="$(dirname -- "$var")" perl -pe 's/\Q$ENV{DIR}\E/./g' < "$filename"

任意のファイルパスを使用できます。


-0777厳密に言うと、改行文字を含むすべてのファイルパスにオプション(slurpモード)を追加する必要があり、末尾のperl改行文字を削除するコマンドの置き換えは使用できません。これは、コンテンツ全体をモジュールからPerl$varに渡して使用することによって実現できます。perldirname()File::Basename

答え2

sedを使用し、変数にsが含まれていないと仮定すると、これはあなたが望むすべてのようです:

$ var='/dir/dir xyz/file.txt'
$ sed "s:$var:.:" file
dog foo/bar .
a b c d . x y z
. 1234
{[(.

なぜ電話したのかわかりませんdirname。また、私たちをsed区切り文字として使用したくない場合は、/このような正規表現メタ文字を使用しないでください。|これはせいぜいコードを混乱させるだけなので、:常にリテラルのような文字を選択してください。環境変数ではなく、変数に変数名をすべて大文字として使用しないでください。Bashおよびシェルスクリプト変数の正しい大文字の使用

与えられたあなたのコメントdirname、何らかの理由で電話する必要がある場合は、次のことができます。

$ sed "s:$(dirname "$var"):.:" file
dog foo/bar ./file.txt
a b c d ./file.txt x y z
./file.txt 1234
{[(./file.txt

関連情報