文字列を含む複数のファイルがあります。文字列を他のファイルの全内容(複数行可能)に置き換える必要があります。どうすればいいですか?
私が必要とするのは、文字列 "filename"ではなく、実際のファイルがsed -i 's/string/filename/' *
どこにあるのかなどです。filename
追加情報:ファイルには、/
または\
または|
などの特殊文字を含めることができます。[
]
答え1
bashはこれに対してうまく機能します。
$ cat replace
foo/bar\baz
the second line
$ cat file
the replacement string goes >>here<<
$ repl=$(<replace)
$ str="here"
$ while IFS= read -r line; do
echo "${line//$str/$repl}"
done < file
the replacement string goes >>foo/bar\baz
the second line<<
awkは動作します。ただバックスラッシュエスケープを解釈するだけです(\b
私の例では)。
$ awk -v string="here" -v replacement="$(<replace)" '
{gsub(string, replacement); print}
' file
the replacement string goes >>foo/baaz
the second line<<
答え2
利用率の低いsedコマンドが必要ですアル字型ファイルを読みます。
sed -i '/string/{r filename
d}'
私はあなたがライン全体を交換したいと仮定し、そうでなければdを適切なものに置き換えます。
答え3
私はこれを働かせました:
$ foo='baz'
$ echo "foobarbaz" | sed "s/foo/${foo}/"
bazbarbaz
さらに一歩進むと、最初の行は次のようになります。
$ foo=`cat filename`
もちろん、これは、変更したい行に到達する前にファイル名を知っていると仮定します。ファイル名がわからない場合は、行を読み、ファイル名を取得してから読み取りと置換を行う必要があります。