将文件中的一个字符串替换为另一个字符串

将文件中的一个字符串替换为另一个字符串

我有一堆配置文件,如下所示:

reader_0 = newcamd({
name = "Oct 1",
host = "hostname 1",
port = 27020,
user = "UNAME",
pass = "password1",
key  = "0102030405060708091011121314",
})

reader_1 = newcamd({
name = "Oct 2",
host = "hostname 2",
port = 27020,
user = "UNAME",
pass = "password2",
key  = "0102030405060708091011121314",
})

如何在“reader_1”部分中使用另一个端口号替换端口号 27020,例如 22443sed

谢谢。

答案1

使用 sed 的前身 ed:

ed -s input <<< $'/^reader_1 =\n/^port =\nc\nport = 22443,\n.\nw\nq'

这将发送ed一个 ANSI 引用的命令字符串来编辑文件。命令依次为:

  1. /^reader_1 =-- 搜索以“reader_1 =”开头的行
  2. /^port =-- 从那里向前搜索以“port =”开头的行
  3. c-- 更改该行
  4. port = 22443,-- 到该文本
  5. .-- 替换文本结束
  6. w-- 将文件写入磁盘
  7. q- 辞职ed

您可以根据您的实际数据收紧或放松正则表达式以或多或少地仔细匹配。

答案2

我假设reader_0host = hostanme 1reader_1host = hostname 2等等。

您可以使用此命令来替换file

sed -i '/host = "hostname 2",/{N;s/port = 27020,/port = 22443,/}' file

答案3

如果同一个文件中有多个相似的行,则必须输入:

sed -i ':a;N;$!ba; s/27020/22443/2' file

在哪里/2意味着它将取代第二场比赛27020。您可以使用不带 -i 参数的命令 sed 测试该命令,以查看给出的结果。

sed -i 's/27020/22443/g' file否则,只要您知道修改哪个文件,简单的方法就有效。

答案4

awk如果您可以使用状态机风格的技术,这可能会更好:

awk '/^reader_1 = newcamd\({/ { section_found = 1} /})/ { section_found = 0 } section_found && /port = 27020,$/ { sub(/27020,$/, "22443,") } { print }' file1 > file2 && mv file2 file1

解释:

当找到节开始时设置一个标志:

/^reader_1 = newcamd\({/ {
    section_found = 1
}

当找到节的末尾时清除标志:

/})/ {
    section_found = 0
}

在右侧部分和右侧行中替换新的端口号:

section_found && /port = 27020,$/ {
    sub(/27020,$/, "22443,")
}

打印所有行:

{
    print
}

将输出发送到 file2 (临时文件):

> file2

如果一切成功,将 file2 重命名为 file1:

&& mv file2 file1

您可以根据需要使正则表达式变得宽松或严格。

sed这种类型的代码比或代码更容易阅读和维护ed,特别是如果您的格式与我在解释中的方式类似。

相关内容