$var
変数()に格納されているパスを変更してこれを実行しようとしていますsed
。実際、$(dirname "$var")
スクリプトの目的に関連した理由で置き換えを行う必要があります。
これの例は、交換するパスが複数含まれている場合var
です。パスは任意の場所にあります(1つは行の真ん中近く、もう1つは行の先頭など)。以下に例を示します。var=/dir/dir xyz/file.txt
filename
filename
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/flags
sed
$var
|
sed
たとえば、.
同様にすべての文字と一致します.
。
以下を行う必要があります。
DIR="$(dirname -- "$var")" perl -pe 's/\Q$ENV{DIR}\E/./g' < "$filename"
任意のファイルパスを使用できます。
-0777
厳密に言うと、改行文字を含むすべてのファイルパスにオプション(slurpモード)を追加する必要があり、末尾のperl
改行文字を削除するコマンドの置き換えは使用できません。これは、コンテンツ全体をモジュールからPerl$var
に渡して使用することによって実現できます。perl
dirname()
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