【问题标题】:awk/gsub - display string before, then after, then before gsubawk/gsub - 在 gsub 之前、之后、之后显示字符串
【发布时间】:2015-12-10 12:31:04
【问题描述】:

仅供参考,我是 awk/gsub 菜鸟。

我有一个 svn 转储,我正在尝试从中创建 users.txt,格式...

user.name = user name <user.name@foo.com>

这就是我要去的地方......

awk '/svn:author/ { getline; getline; gsub("[\.]", " ", $1); print $0, " = ", $1 , " <", $0, "@foo.com>"}' svn_dmp | sort | uniq

不幸的是,它正在更改 $0 的值并删除所有 . 所以我得到...

mr foo = mr foo <mr foo@foo.com>

我希望gsub 将新字符串写入$1 并保留$0。如何将点换成仅在mr.foo 中间的空格?

【问题讨论】:

  • $0 是包括$1 在内的整行,因此当您更改$1 时,您也会更改$0 的那部分。
  • 在使用 getline 之前,请务必阅读并完全理解 awk.info/?tip/getline 上关于 getline 的所有警告和哥特式声明,然后通常不会。您的问题不需要 getline 并且您使用它的方式无论如何都是错误的。发布几行示例输入和预期输出,我们可以为您提供帮助。

标签: svn awk gsub


【解决方案1】:

$0 是整行,其中包括$1,因此当您更改$1 时,您也更改了$0 的那部分。如果要保留原始的$0,则需要在修改$1 之前将其保存在另一个变量中。

类似

$ echo 'mr.foo' | awk '{orig=$0
                        gsub("[\.]", " ", $1)
                        print orig " = "  $1 " <" orig "@foo.com>"}'

mr.foo = mr foo <mr.foo@foo.com>

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2020-06-09
    相关资源
    最近更新 更多