(command.CommandList
  children: [
    (C {(echo)} 
      {
        (DQ ('/* Automatically generated by ') ($ Id.VSub_Number '$0') (' */\n') 
          ('struct cmdname_help {\n') ('\tchar name[16];\n') ('\tchar help[80];\n') ('\tunsigned char group;\n') ('};\n') ('\n') 
          ('static const char *common_cmd_groups[] = {')
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:grps)
          op: assign_op.Equal
          rhs: {(grps) ($ Id.VSub_Dollar '$$') (.tmp)}
          spids: [20]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:match)
          op: assign_op.Equal
          rhs: {(match) ($ Id.VSub_Dollar '$$') (.tmp)}
          spids: [25]
        )
      ]
    )
    (C {(trap)} 
      {(DQ ("rm -f '") ($ Id.VSub_DollarName '$grps') ("' '") ($ Id.VSub_DollarName '$match') ("'"))} {(0)} {(1)} {(2)} {(3)} {(15)}
    )
    (C {(sed)} {(-n)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\t1,/^### common groups/b\n' span_id:57) (Token id:Id.Lit_Chars val:'\t/^### command list/q\n' span_id:58) 
          (Token id:Id.Lit_Chars val:'\t/^#/b\n' span_id:59) (Token id:Id.Lit_Chars val:'\t/^[ \t]*$/b\n' span_id:60) 
          (Token
            id: Id.Lit_Chars
            val: '\th;s/^[^ \t][^ \t]*[ \t][ \t]*\\(.*\\)/\tN_("\\1"),/p\n'
            span_id: 61
          ) (Token id:Id.Lit_Chars val:'\tg;s/^\\([^ \t][^ \t]*\\)[ \t].*/\\1/w ' span_id:62)
        ) ($ Id.VSub_DollarName '$grps') 
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:66) (Token id:Id.Lit_Chars val:'\t' span_id:67))
      } {(DQ ($ Id.VSub_Number '$1'))}
    )
    (C {(printf)} {(SQ (Token id:Id.Lit_Chars val:'};\\n\\n' span_id:77))})
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:n) op:assign_op.Equal rhs:{(0)} spids:[81])]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:substnum)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [84]
        )
      ]
    )
    (command.WhileUntil
      keyword: (Token id:Id.KW_While val:while span_id:86)
      cond: [(C {(read)} {(grp)})]
      body: 
        (command.DoGroup
          children: [
            (C {(echo)} {(DQ ('^git-..*[ \t]') ($ Id.VSub_DollarName '$grp'))})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:substnum)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName '$substnum') 
                        (braced_var_sub
                          token: (Token id:Id.VSub_Name val:substnum span_id:107)
                          suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonPlus arg_word:{(';')})
                        ) ('s/[ \t]') ($ Id.VSub_DollarName '$grp') (/) ($ Id.VSub_DollarName '$n') (/)
                      )
                    }
                  spids: [103]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:n)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$n')})
                            right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)})
                          )
                      )
                    }
                  spids: [119]
                )
              ]
            )
          ]
        )
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Less val:'<' span_id:129)
          fd: -1
          arg_word: {(DQ ($ Id.VSub_DollarName '$grps'))}
        )
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:134)
          fd: -1
          arg_word: {(DQ ($ Id.VSub_DollarName '$match'))}
        )
      ]
    )
    (C {(printf)} 
      {(SQ (Token id:Id.Lit_Chars val:'static struct cmdname_help common_cmds[] = {\\n' span_id:143))}
    )
    (command.Pipeline
      children: [
        (C {(grep)} {(-f)} {(DQ ($ Id.VSub_DollarName '$match'))} {(DQ ($ Id.VSub_Number '$1'))})
        (C {(sed)} {(SQ (Token id:Id.Lit_Chars val:'s/^git-//' span_id:163))})
        (C {(sort)})
        (command.WhileUntil
          keyword: (Token id:Id.KW_While val:while span_id:172)
          cond: [(C {(read)} {(cmd)} {(tags)})]
          body: 
            (command.DoGroup
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:tag)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:184)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(echo)} {(DQ ($ Id.VSub_DollarName '$tags'))})
                                      (C {(sed)} 
                                        {(DQ ($ Id.VSub_DollarName '$substnum') ('; s/[^0-9]//g'))}
                                      )
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [183]
                    )
                  ]
                )
                (C {(sed)} {(-n)} 
                  {
                    (SQ (Token id:Id.Lit_Chars val:'\n' span_id:207) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\t/^NAME/,/git-'
                        span_id: 208
                      )
                    ) (DQ ($ Id.VSub_DollarName '$cmd')) 
                    (SQ (Token id:Id.Lit_Chars val:'/H\n' span_id:214) 
                      (Token id:Id.Lit_Chars val:'\t\t${\n' span_id:215) (Token id:Id.Lit_Chars val:'\t\t\tx\n' span_id:216) 
                      (Token id:Id.Lit_Chars val:'\t\t\ts/.*git-' span_id:217)
                    ) (DQ ($ Id.VSub_DollarName '$cmd')) (SQ (Token id:Id.Lit_Chars val:' - \\(.*\\)/\t{"' span_id:223)) 
                    (DQ ($ Id.VSub_DollarName '$cmd')) (SQ (Token id:Id.Lit_Chars val:'", N_("\\1"), ' span_id:229)) ($ Id.VSub_DollarName '$tag') 
                    (SQ (Token id:Id.Lit_Chars val:'},/\n' span_id:233) 
                      (Token id:Id.Lit_Chars val:'\t\t\tp\n' span_id:234) (Token id:Id.Lit_Chars val:'\t\t}' span_id:235)
                    )
                  } {(DQ (Documentation/git-) ($ Id.VSub_DollarName '$cmd') (.txt))}
                )
              ]
            )
        )
      ]
      negated: F
    )
    (C {(echo)} {(DQ ('};'))})
  ]
)