2017-09-24 9 views
0

を文字列を移動するためにsedを使用して:どのように私は、この変更するsedを使用することができ、複数のラインパターン

pre_somestruct_post = restruct. 
int8lu('foo'). 
int8lu('bar') 

typedef struct 
{ 
    uint8_t foo; 
    uint8_t bar; 
} a_somestruct_b; 

を私は変換するために、多くの「somestruct」構造体を持っています。

+0

変更の基準はどのようなものか教えてください。条件を知らなくても、どのようにコードを書くことができるのかはまったく分かりません。 – RavinderSingh13

答えて

1

awkをソリューションあなたが始めるために:

$ cat tst.awk 
/typedef struct/{p=1;next}        # start capturing 
p && $1=="}" { 
    split($2,a,"_")          # capture "somestruct" 
                  # in a[2] 
    printf "%s_%s_%s = restruct.\n", "pre", a[2], "post" # possibly "pre" and "post" 
                  # should be "a" and "b" 
                  # here? 
    for (j=1;j<=i;j++) printf "%s%s\n", s[j], (j<i?".":"") # print saved struct fields 
    delete s; i=0; p=0          # reinitialize 
} 
p && NF==2{ 
    split($1, b, "_")          # capture type 
    sub(/;/,"",$2)           # remove ";" 
    s[++i]=sprintf(" %slu('%s')", b[1], $2)    # save struct field in 
                  # array s 
} 

テストこのファイルINPUT.TXTと:

$ cat input.txt 
typedef struct 
{ 
    uint8_t foo; 
    uint8_t bar; 
} a_atruct_b; 

typedef struct { 
    uint8_t foo; 
    uint8_t bar; 
} a_bstruct_b; 

typedef struct 
{ 
    uint8_t foo; 
    uint8_t bar; 
} a_cstruct_b; 

が与える:

$ awk -f tst.awk input.txt 
pre_atruct_post = restruct. 
    uint8lu('foo'). 
    uint8lu('bar') 
pre_bstruct_post = restruct. 
    uint8lu('foo'). 
    uint8lu('bar') 
pre_cstruct_post = restruct. 
    uint8lu('foo'). 
    uint8lu('bar') 

同じことを、一人として - ライナー:

$ awk '/typedef struct/{p=1;next} p && $1=="}" {split($2,a,"_");printf "%s_%s_%s = restruct.\n", "pre", a[2], "post";for (j=1;j<=i;j++) printf "%s%s\n", s[j], (j<i?".":"");delete s; i=0; p=0} p && NF==2 {split($1, b, "_");sub(/;/,"",$2);s[++i]=sprintf(" %slu('%s')", b[1], $2)}' input.txt 
0
$ cat sed_script 
/typedef struct/{       # find the line with "typedef struct" 
    n;n;          # Go to next two line 
    /uint8_t/{        # Find the line with "uint8_t" 
    s/uint8_t (.*);/int8lu(\x27\1\x27)./; # substitute the line, i.e. int8lu('foo'). 
    h;n;         # copy the pattern space to the hold space, 
              # then go to next line 
    s/uint8_t (.*);/int8lu(\x27\1\x27)/; # substitute the line, i.e. int8lu('bar') 
    H;n          # append the pattern space to the hold space 
              # then go to next line 
    }; 
    s/.*_(.*)_.*/pre_\1_post = restruct./p; # substitute and print the line, 
              # i.e., pre_somestruct_post = restruct. 
    g;p          # copy the hold space to the pattern space 
              # and then print 
} 

$ sed -rn -f sed_script input 
pre_somestruct_post = restruct. 
    int8lu('foo'). 
    int8lu('bar') 

出力を確認した後、あなたが希望するものである、sed場所でファイルを編集するための-iオプションが追加されました。

+1

OPは、彼が望むものを指定するのにそれほど広範ではありません。しかし、私は 'uint8'が彼が入力で遭遇する唯一のタイプであることは疑う。もちろん、あなたは正規表現で簡単にそれを変更することができます。一方、あなたは彼の正確な質問に答えています。 –

+0

はい、検索したパターンはいつでも変更できます。私は問題を解決するために 'sed'メソッドを提供しようとしています。 – CWLiu

関連する問題