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を含む複数のシェルを使用すると、より簡単でクリーンになります。