パスを修正

パスを修正

$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

おすすめ記事