sed - 用文件内容替换字符串

Jay*_*Kah 33 sed text-processing

我有两个文件:file1file2.

file1 有以下内容:

---
  host: "localhost"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "localhost:2181"
Run Code Online (Sandbox Code Playgroud)

file2包含一个 IP 地址 ( 1.1.1.1)

我想要做的是替换localhost1.1.1.1,以便最终结果是:

---
  host: "1.1.1.1"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "1.1.1.1:2181"
Run Code Online (Sandbox Code Playgroud)

我试过了:

sed -i -e "/localhost/r file2" -e "/localhost/d" file1
sed '/localhost/r file2' file1 |sed '/localhost/d'
sed -e '/localhost/r file2' -e "s///" file1
Run Code Online (Sandbox Code Playgroud)

但是我要么替换整条线路,要么将 IP 放到我需要修改的线路之后。

cuo*_*glm 21

这是一个sed解决方案:

% sed -e "s/localhost/$(sed 's:/:\\/:g' file2)/" file1
---
  host: "1.1.1.1"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "1.1.1.1:2181"
Run Code Online (Sandbox Code Playgroud)

您应该使用sed -i来进行适当的更改。

如果您可以使用awk,这是一种方法:

% awk 'BEGIN{getline l < "file2"}/localhost/{gsub("localhost",l)}1' file1
---
  host: "1.1.1.1"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "1.1.1.1:2181"
Run Code Online (Sandbox Code Playgroud)

  • +1 表示`awk`。我想`sed` _is_ 能够做到这一点,但它会非常笨拙。这就是 `awk` 闪耀的地方! (5认同)
  • 您需要在替换中同时转义 `/` 和 `&amp;`。那是`"$(sed 's:[/\\&amp;]:\\&amp;:g' file2)"` (2认同)

Vol*_*gel 13

在使用之前,您可以使用 shell 命令替换读取带有替换字符串的文件sed。所以sed只会看到一个正常的替换:

sed "s/localhost/$(cat file2)/" file1 > changed.txt

  • 这适用于多行文件和带有特殊字符的文件吗? (29认同)
  • @TrevorHickey 不是。Sed 只是失败,并出现“未终止的 `s' 命令”错误。 (20认同)

unx*_*nut 0

尝试使用

join file1 file2
Run Code Online (Sandbox Code Playgroud)

然后,删除任何不需要的字段。