# # # patch "mangle.cc" # from [004a0da4eb54257a40e5b33b45e3cecfccae36e3] # to [0eb62d97918c594ab0f1797f036a8986eac7359c] # ============================================================ --- mangle.cc 004a0da4eb54257a40e5b33b45e3cecfccae36e3 +++ mangle.cc 0eb62d97918c594ab0f1797f036a8986eac7359c @@ -40,7 +40,7 @@ ("pattern,p", po::value(), "output pattern, like printf") ("field,f", po::value >(), "key,num field specifier") ("delim,d", po::value >(), "key that begins a stanza") - ("reverse,V", "output non-matching stanzas") + ("seperator,s", po::value(), "if a key appears multiple times, join any affected fields with this (defaults to space)") ; po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); @@ -55,6 +55,9 @@ cout << "other fields are numberd 1 to n, and -n to -1\n"; return 1; } + string sep(" "); + if (vm.count("seperator")) + sep = vm["seperator"].as(); string pattern = vm["pattern"].as(); { unsigned int p=pattern.find('\\'); @@ -95,7 +98,6 @@ stanza st; stanza_reader sr(cin, vm["delim"].as >()); - bool first = true; while (sr.get(st)) { boost::format f(pattern); @@ -109,13 +111,15 @@ { if (j->key == i->first) { + int size(j->values.size()); + if (!s.empty() && i->second <= size && -i->second <= size) + s += sep; if (!i->second) - s = j->key; - else if (i->second < 0 && -i->second <= j->values.size()) - s = j->values[j->values.size() + i->second].parsed; - else if (i->second <= j->values.size()) - s = j->values[i->second-1].parsed; - break; + s += j->key; + else if (i->second < 0 && -i->second <= size) + s += j->values[j->values.size() + i->second].parsed; + else if (i->second <= size) + s += j->values[i->second-1].parsed; } } f % s;