【问题标题】:Awk-substitution patternawk 替换模式
【发布时间】:2012-12-19 14:13:10
【问题描述】:

我有两个示例文件:

文件1:

Bolek
jeden(wzór1)
Lolek
dwa(wzór2)
trzy(wzór3)

文件2:

czerwony
zielony
niebieski

我试过命令:

awk '{while(getline a < "file2"); sub(/wzór1/, a); print }' file1
Bolek
jeden(niebieski)
Lolek
dwa(wzór2)
trzy(wzór3)

我想在“file2”的内容上替换“file1”的wzór1。 我要打印:

Bolek
jeden(czerwony
zielony
niebieski)
Lolek
dwa(wzór2)
trzy(wzór3)

【问题讨论】:

标签: awk


【解决方案1】:

一种方式:

$ awk -v val="$(<file2)" '{sub(/wzór1/,val);}1' file1
Bolek
jeden(czerwony
zielony
niebieski)
Lolek
dwa(wzór2)
trzy(wzór3)

file2 的内容被读入变量“cont”。这个变量被传递给awk,所有出现的wzor1都被替换为变量内容。

【讨论】:

  • 请注意,这种方法将删除 file2 末尾的所有空白行,而不是按原样复制 file2 的内容。这可能是可取的,也可能不会出现在您的特定输入文件中,但您应该注意这一点。
【解决方案2】:
awk 'NR==FNR{r=r s $0; s=ORS; next} {sub(/wzór1/,r)} 1' file2 file1

假设您使用的是 UNIX,这是迄今为止发布的 2 个解决方案中的方法之间的区别,请注意“file2”末尾的空行:

$ cat file2
czerwony
zielony
niebieski

$ awk 'NR==FNR{r=r s $0; s=ORS; next} {sub(/wzr1/,r)} 1' file2 file1
Bolek
jeden(czerwony
zielony
niebieski
)                   <--- note the empty line is reproduced
Lolek
dwa(wzr2)
trzy(wzr3)
$ awk -v val="$(<file2)" '{sub(/wzr1/,val);}1' file1
Bolek
jeden(czerwony
zielony
niebieski)          <--- note the empty line has been removed
Lolek
dwa(wzr2)
trzy(wzr3)

如果您不在 UNIX 上,那么我认为 shell 解决方案将是 N/A。

【讨论】:

  • @steve 但它独立于操作系统(OP 没有告诉我们)独立工作,并完全按照编写的方式复制 file2,因此它比发布的 shell 解决方案更便携和健壮。
  • 啊,我经常忘记检查是否为空。接得好。你是对的,空行可能很重要,尽管鉴于问题无法判断。
  • @steve 可能是 OP 在 UNIX 上,删除尾随空行对他的输入无关紧要,值得一提。对我来说,在 awk 中做这一切确实很自然,但是 YMMV 并且如果你在 UNIX 上,混合一些 shell 以使其更简洁并没有错。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 2017-06-16
  • 2018-04-30
  • 1970-01-01
  • 2012-06-03
  • 2017-02-14
  • 1970-01-01
  • 2014-04-07
相关资源
最近更新 更多