【问题标题】:Sed (or awk) replace hosts found in listsed(或 awk)替换列表中的主机
【发布时间】:2013-04-06 00:03:12
【问题描述】:

抱歉标题令人困惑,如果没有示例,我无法完全表达我想要做什么。

我运行了一串命令,生成的输出如下所示:

Host_A
Host_B
Net_X
Group_Y

以此类推

然后我想获取该输出并将其提供给 sed,以便它将在上一个列表中找到的任何字符串实例替换为新字符串,例如 Host_Q。

sed 's/Host_A/Host_Q/g' 

工作正常,但我想避免手动为每个主机编写一个 sed 字符串。

谢谢!

编辑:更好的例子

grep 流产生:

Host_A
Host_B
Host_C
Host_D
+lots more

我想将该 grep 流通过管道传送到 sed,并让 sed 将这些主机的所有实例替换为一个新的(虽然相同)主机名。

Editx2:此外,列表是动态的。所以我对新文件运行的每种类型,内容都会不同,这就是为什么我不能(也不想)硬编码原始值。

编辑:::

我自己想出来的,对不起各位。

我是这样处理的:

awk '{print "sed \x27s\/"$1"/HOST_Q/g\x27"}'

抱歉让你这么混乱

【问题讨论】:

  • 这是stackoverflow.com/questions/15829445/… 的副本,或者至少可以在该线程中找到该问题的解决方案。
  • 您的问题含糊不清,我不确定我是否理解正确,您能说得具体点吗?
  • 编辑是否让它变得更好?
  • 所以你想自动替换 Host_A -> Host_Q, Host_B -> Host_W 什么的?并在程序输出中对这些单词的每一次出现进行替换?
  • Host_A -> Host_Q | Host_B -> Host_Q 等都得转成Host_Q。是的,所有实例

标签: bash sed awk


【解决方案1】:

你想像这样在同一个命令中放置多个替换字符串吗?

mycommands | sed '
s/Host_A/Host1/g 
s/Host_B/Host2/g 
s/Net_X/Net1/g 
s/Group_Y/Group2/g'

或者像这样创建一个命令文件:

#!/bin/sed -f
s/Host_A/Host1/g 
s/Host_B/Host2/g 
s/Net_X/Net1/g 
s/Group_Y/Group2/g'

将此脚本保存为“chgnames”之类的文件并使其可执行,您可以使用简单的命令:

我的命令 | ./chgnames

【讨论】:

  • 我看到你刚刚修改了你的问题:)
  • 是的,对不起 :) - 应该是 's/*/Host_Q/g' 对他们很多
【解决方案2】:
sed 's#^\(Host_A\|Host_B\)$#Host_Q#'

那个?

【讨论】:

  • 这太具体了。我希望转换 grep 输出的所有内容。重点是不必输入列表的原始内容。
  • 现在我们回到第一方。如果您将输出中的“所有内容”替换为 Host_Q,那么您为什么首先要 grepping?我的猜测是您的问题是错误的,您的输出不仅仅是显示主机名的一列,因为那样这将是绝对没用的,只需打印 Host_Q x 次 grep 的输出行。请详细说明:-)
  • 另一个疯狂的猜测:您的目标是获取此列表并将这些主机名替换为 another 文件中的 Host_Q 吗?
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 2021-12-07
  • 2010-10-27
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2013-06-01
相关资源
最近更新 更多