我有几个文件都包含一个字符串。该字符串需要替换为另一个文件的全部内容(可能是多行)。我怎样才能做到这一点?
我需要的是诸如实际文件在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 命令r它读取一个文件:
sed -i '/string/{r filename
d}'
我假设您想替换整行,否则将 d 替换为合适的内容。
答案3
我让这个工作:
$ foo='baz'
$ echo "foobarbaz" | sed "s/foo/${foo}/"
bazbarbaz
更进一步,您的第一行将类似于:
$ foo=`cat filename`
当然,这假设您在到达要替换的行之前知道文件名 - 如果您不知道,则必须读取该行,获取文件名,然后执行读取和替换。