从搜索模式中读取变量,并使用读取变量将模式替换为不同模式

时间:2018-02-06 18:35:10

标签: linux awk sed

我想替换文本文件中的模式,并从模式中读取变量xy,以将它们插入到我将要替换的模式中。

我想替换每一次:

Array<x, y> someArray;

以下内容:

Array<> someArray(x, y);

所以,例如这一行:

Array<3, 4> someArray;

将替换为:

Array<> someArray(3, 4);

如何使用awk或sed实现这一目标?

2 个答案:

答案 0 :(得分:1)

sed

sed -E 's/^(Array)<([^>]+)>( someArray)/\1<>\3(\2)/' file

答案 1 :(得分:0)

$ cat r.sh
awk '
BEGIN {
    b = "[ \t]+"         # blank
    i = "[_a-zA-Z0-9]+"  # identifier: should match x, 1 and so on
}
{
    parse()
    if (OK)
        printf "Array<> %s(%s, %s);\n", name, x, y
    else
        print $0
}
function parse() {
    l = $0; OK = 1
    n("Array")
    n("<")
    n(i); x = P
    n(",")
    n(i); y = P
    n(">")
    n(i); name = P
}
function n(p) {
    if (!OK) return
    n1(b); OK = 1 # skip blank
    return n1(p)
}
function n1(p) {
    p = "^" p
    if (match(l, p)) P = n0()
    else OK = 0
}
function n0(   s) {
    s = substr(l, 1, RLENGTH)
    l = substr(l, RLENGTH + 1)
    return s
}
' "$@"

用法

$ sh r.sh file
Array<> someArray(x, y);
Array<> someArray(3, 4);