【问题标题】:string replacement in unixunix 中的字符串替换
【发布时间】:2015-03-12 21:38:59
【问题描述】:

需要有关如何在 UNIX 中使用 SED 或 AWK 命令解决此问题的解决方案。

我有一个源文件,其值必须按如下方式填充。 (必须从参考文件中获取值并更新源文件)。

源文件:

aaaa
Uid=xxxx
pwd=nnnn
bbbb
uid=yyyy
pwd=eeee
cccc
uid=zzzz
pwd=kkkk

参考文件:

block,  parameter,  value
aaaa,       uid,            1a1a
aaaa,   pwd,        1b1b
bbbb,   uid,        2a2a
bbbb,   pwd,        2b2b
cccc,   uid,        3a3a
cccc,   pwd,        3b3b

输出文件:

aaaa
Uid=1a1a
pwd=1b1b
bbbb
uid=2a2a
pwd=2b2b
cccc
uid=3a3a
pwd=3b3b

要求:

对于 aaaa,SED 必须在第 1 行和第 3 行中搜索 Uid,并替换“=”之后的值。即,带有 1a1a 的 xxxx。

对于 bbbb,SED 必须在第 5 行和第 7 行内搜索 Uid,并替换“=”之后的值。即 yyyy 与 2a2a。

其他参数也是如此。

谢谢。

【问题讨论】:

  • 请使用编辑按钮并以可读的方式格式化问题。此外,这看起来与您之前的问题非常相似。你用过它的答案吗?
  • 它没有按我的预期工作。在 SED 中指定行号是一种方法。但就我而言,我传递的所有值都是变量,因此面临一些问题。顺便说一句,这是给出的最合适的建议...... sed -e '$str_val,${end_val}s/string/replace/' filename.txt...... 这仅适用于 1 次出现,比如说对于“aaaa”。
  • 如我之前所说:使用edit按钮将此信息添加到问题中,使问题更清晰。
  • 抱歉...当时不知道。

标签: unix awk sed grep


【解决方案1】:

sed 用于单个行上的简单替换。对于任何其他文本操作,您应该使用 awk:

$ cat tst.awk
BEGIN { FS = "[,[:space:]=]+" }
NR==FNR {
    if (NR>1) {
        map[$1,$2] = $3
    }
    next
}
{
    if (NF==1) {
        key = $0
    }
    else {
        $0 = $1 "=" map[key,tolower($1)]
    }
    print
}

$ awk -f tst.awk ref.txt src.txt
aaaa
Uid=1a1a
pwd=1b1b
bbbb
uid=2a2a
pwd=2b2b
cccc
uid=3a3a
pwd=3b3b

【讨论】:

  • 我会检查并一定会让您知道...谢谢! :)
  • 使用 mawk 1.3.3(给定 bu awk -W version)我不得不将第一行的 [:space:] 替换为文字空格(并且应该添加制表符,..)
  • 然后摆脱 mawk 并至少获得一个 POSIX awk,因为谁知道还有什么可能被破坏:-)。说真的 - 获得 GNU awk,你以后会感谢自己的。
  • @EdMorton - 谢谢... :-) .. 它运行良好... 现在我有几个疑问... 首先,如何从参考中获取值(查找文件),如果它有两列(value1 和 value2) .. ?我需要来自“value1”列或“value2”列的值...基于我提供给脚本的输入参数...其次,如果源文件有其他记录,而参考中没有查找数据文件...脚本必须打印其原始值....怎么做???抱歉,如果我的疑虑如此幼稚,因为我对 shell 脚本很陌生.... :-)
  • @EdMorton - 另外......如果参考文件中的查找数据被打乱了怎么办......就像如果 cccc 出现在 bbbb 集之前?我也需要一个解决方案......如果你能提供,那就太好了! :-)
猜你喜欢
  • 2012-11-19
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多