68

私はcshスクリプトを持っています(ただし、関連性があれば言語を変更できます)。

sed s/AAA/BBB/ file

問題は、AAAとBBBがパスであるため、「/」が含まれていることです。AAAは固定されているので、次のように言うことができます。

sed s/\\\/A\\\/A\\\A/BBB/ file

ただし、BBBは$PWDを含む変数に基づいています。$ PWDの「/」をエスケープするにはどうすればよいですか?

または、これを完全に行う必要がある他の方法はありますか?

4

7 に答える 7

137

sed/コマンドの代わりに任意の区切り文字を使用できますs。パスで検出されないものを使用するだけです。

s+AAA+BBB+

等々。

または(推測したくない場合は)、sedを使用してパスを前処理し、スラッシュをエスケープすることができます。

pwdesc=$(echo $PWD | sed 's_/_\\/_g')

次に、で必要なことを行い$pwdescます。

于 2012-08-21T19:12:49.783 に答える
47

置換文字列またはパターン文字列にスラッシュが含まれている状況では、GNUSedが置換コマンドの代替区切り文字を許可しているという事実を利用できます。区切り文字の一般的な選択肢は、パイプ文字です。またはハッシュ#-文字を区切る最良の選択は、多くの場合、処理されるファイルのタイプによって異なります。あなたの場合、あなたは試すことができます

sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file

注:最後の#の後のgは、最初のオカレンスを変更する場合は、ファイル内のすべてのオカレンスを変更することです。gは使用しないでください。

于 2014-10-28T08:29:37.313 に答える
16
sed -i "s|$fileWithPath|HAHA|g" file

編集1

sed -i 's|path/to/foo|path/to/bar|g' file
于 2014-11-19T23:36:33.240 に答える
8

csh通常、本格的なスクリプトに使用することはお勧めしません。しかし、それは目前の問題に正接しています。

あなたはおそらく次のようなものを求めています:

sed -e "s=$oldpath=$newpath="

ここで、シェル変数$oldpathには置換される値が$newpath含まれ、置換が含まれ、どちらの変数にも等号が含まれていないと想定されます。つまり、パターンで区切り文字を選択でき、通常の/区切り文字を回避することで、パス名のスラッシュに関する問題を回避できます。ファイル名に表示される可能性があると思われる場合は=、control-Aやcontrol-Gなど、表示される可能性が低いものを選択してください。

于 2012-08-21T19:10:43.147 に答える
3

私の場合、以下の方法が機能します。

sed -i 's/playstation/PS4/' input.txt

次のように書くこともできます

sed -i 's+playstation+PS4+' input.txt
  • sed:ストリームエディタです

  • -i:ソースファイルを編集できます

  • +:区切り文字です。

上記の情報がお役に立てば幸いです。

于 2020-08-18T10:14:29.247 に答える
2

/h/ネットワークパス参照をパスから取得する必要がありました。それらを/c/ドライブに戻すと、存在しないディレクトリにマップされますが、すぐに解決されます。私の.bashrcで使用しました

PATH=`echo $PATH | sed -e "s+/h/+/c/+g"`
于 2019-06-12T15:16:01.597 に答える
0

括弧の展開${i/p/r}を使用して、スラッシュをエスケープできます。この場合${i//p/r}、すべての発生をエスケープします。

$p1=${p1//\//\\/}
$p2=${p2//\//\\/}
sed s/$p1/$p2/ file

または、より簡潔に、1行でsed s/${p1//\//\\/}/${p2//\//\\/}/ file

2つの最初のスラッシュ//は、すべてのオカレンスに一致していることを示す括弧展開の区切り文字で\/あり、検索テンプレートのスラッシュをエスケープするための/ものであり、展開の2番目の区切り文字として使用され\\/、代わりに使用されます。魔女ではバックスラッシュをエスケープする必要があります。 。

于 2015-01-12T14:41:47.670 に答える