sed を使用して、スラッシュパスをループのバックスラッシュパスに置き換えます。

sed を使用して、スラッシュパスをループのバックスラッシュパスに置き換えます。

Windowsサーバーのパス(\\ 100.100.0.0 \ aaa \ bbb \ ccc \)をフォルダ(/xxx/yyy/zzz/)のすべての.txtファイルに表示されるLinuxパス/foo/barに置き換えたいと思います。 /。

私はこれのためにループを作成しましたが、bashやtcsh(foreachを使用)では動作しないようです。

#!/bin/bash
FILES="/xxx/yyy/zzz/*.txt"
for f in $FILES
do
        sed -i 's+\\100.100.0.0\aaa\bbb\ccc\+/foo/bar/+g' $f
done

私が得るエラーは次のとおりです。

sed: -e expression #1, char 133: unterminated `s' command

問題は、sedがこれらのトリッキーな文字を処理する方法にあるようですが、識別できません。

よろしくお願いします。

ベストアンサー1

\正規表現の構文(および他の多く)のエスケープ演算子であるため、独自にエスケープする必要があり、.また特別です。ここで、\前の結果は区切り文字として使用されません++s+pattern+replacement+flag

ループやbashも必要ありません。

#! /bin/sh -
sed -i 's|\\\\100\.100\.0\.0\\aaa\\bbb\\ccc\\|/foo/bar/|g' /xxx/yyy/zzz/*.txt

bashと変数を使用するには、配列を使用することをお勧めします。

#! /bin/bash -
shopt -s nullglob
files=( /xxx/yyy/zzz/*.txt )
if (( ${#files[@]} > 0 )); then
  sed -i -- 's|\\\\100\.100\.0\.0\\aaa\\bbb\\ccc\\|/foo/bar/|g' "${files[@]}"
fi

shそれにもかかわらず、以外のシェルを使用したい場合はbash比較的良くない選択です(確かに今世紀に使用してはならない(t)cshほど悪くはありません)。 zsh、ksh93、またはFishを含む複数のシェルを使用すると、より簡単でクリーンになります。

おすすめ記事