Bash、Awk、Sed?在文件中查找字符串并在字符串中附加数字?

标签 bash loops awk sed

我想逐行搜索一个大文本文件,找到包含“N:;;”的每个条目,只需将其更改为“N:07401000000;;”,然后下一次出现的“N:;;”将更改为“N:07401000002;;”,依此类推整个条目文件。以下是之前和之后的示例。

之前:

BEGIN:VCARD
VERSION:2.1
N:;;
TEL;TYPE=CELLVOICE:07401000000
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:;;
TEL;TYPE=CELLVOICE:07401000001
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:;;
TEL;TYPE=CELLVOICE:07401000002
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:;;
TEL;TYPE=CELLVOICE:07401000003
END:VCARD

之后的结果是这样的:

BEGIN:VCARD
VERSION:2.1
N:07401000000;;
TEL;TYPE=CELLVOICE:07401000000
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:07401000001;;
TEL;TYPE=CELLVOICE:07401000001
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:07401000002;;
TEL;TYPE=CELLVOICE:07401000002
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:07401000003;;
TEL;TYPE=CELLVOICE:07401000003
END:VCARD

任何帮助或想法都会很棒。

Do you want the N values to start at a hard-coded value and increment or just copy the value from the subsequent CELLVOICE?

其实这是个好主意。 CELLVOICE里面提到的值怎么样。

最佳答案

这是执行您想要的操作的最健壮且最容易扩展的方法:

$ cat tst.awk
BEGIN { RS="END:VCARD\\s*"; FS="\n"; OFS=":" }
{
    $0 = $0 gensub(/\s+$/,"",1,RT)

    for (i=1; i<=NF; i++) {
        name = gensub(/:.*/,"",1,$i)
        value = gensub(/.*:/,"",1,$i)
        n2v[name] = value
        names[i] = name
    }

    n2v["N"] = n2v["TEL;TYPE=CELLVOICE"] n2v["N"]

    for (i=1; i<=NF; i++) {
        name  = names[i]
        value = n2v[name]
        print name, value
    }
}

.

$ awk -f tst.awk file
BEGIN:VCARD
VERSION:2.1
N:07401000000;;
TEL;TYPE=CELLVOICE:07401000000
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:07401000001;;
TEL;TYPE=CELLVOICE:07401000001
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:07401000002;;
TEL;TYPE=CELLVOICE:07401000002
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:07401000003;;
TEL;TYPE=CELLVOICE:07401000003
END:VCARD

以上使用 GNU awk 实现 gensub()、多字符 RSRT,基本(和惯用的)想法是将输入拆分为以 END:VCARD 结尾的记录,并为每个记录首先创建一个数组 (n2v[]) 映射字段名称(第一个 : 每行)到它们的值(第一个 : 之后的部分),然后你可以通过它的名字来操作每个字段,这样你就可以简单地改变值,重新排列顺序, 填写默认值等等等等

关于Bash、Awk、Sed?在文件中查找字符串并在字符串中附加数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39945765/

相关文章:

python - 从键列表中过滤字典

mysql - 公式中省略了最后一条记录

unix - 寻找匹配的 `"时出现意外 EOF '

linux - Grep 变量模式匹配

bash - 将 bash 变量传递给内联 perl 脚本

regex - 使用awk提取括号中的部分字符串

python - 通过交互式 shell 控制 Raspberry Pi 的 Telegram 机器人

linux - Bash/Dialog 的返回值 --checklist

android - 循环动画集会导致 StackOverflowError

html - 在 HTML/XML 文件中高效搜索