Usando GNU awk
, buscando campos con solo números:
awk -v FPAT='[0-9]+' -v OFS=',' '{$2=$2 "/" $3; printf "%s,%s,",$1,$2; for(i=4;i<=NF;i++){ printf "%s%s",$i,i==NF?ORS:OFS}}' <<< "|Ordernum=8921|mn=03|yr=20|id=869|Name=1|Street=2|City=3|State=4|Zip=5|Country=6|"
FPAT
describe cómo se ve el patrón. En este caso, se compone de número solamente.
OFS
es el separador de campo de salida que permite formatear con ,
.
El segundo campo se reconstruye con el tercero. Todos los demás se imprimen tal cual.
Возможно, я нашел свой собственный ответ:
https://stackoverflow.com/questions/36998143/alternative-way-to-obtain-argc-and-argv-of-a-process
__attribute__((constructor)) void stuff(int argc, char **argv)
{
for (int i=0; i<argc; i++) {
printf("%s: argv[%d] = '%s'\n", __FUNCTION__, i, argv[i]);
}
}
Конечно, остается проблема с пропуском аргументов, IE, вы можете просмотреть аргументы, но основная ()программа завершится ошибкой, когда обнаружит, что аргументы вашей библиотеки смешаны со своими собственными.
В Linux[1] вы можете переопределить __libc_start_main()
функцию (оболочку, которая вызывает main()
функцию )из вашей библиотеки. Вы можете сделать это несколько раз.
Пример:
#define _GNU_SOURCE /* for RTLD_NEXT */
#include <string.h>
#include <unistd.h>
#include <dlfcn.h>
#include <err.h>
#ifdef __UCLIBC__
#define __libc_start_main __uClibc_main
#endif
#define STR_(s) #s
#define STR(s) STR_(s)
int __libc_start_main(
int (*main)(int,char**,char**), int ac, char **av,
int (*init)(int,char**,char**), void (*fini)(void),
void (*rtld_fini)(void), void *stack_end)
{
typeof(__libc_start_main) *real_lsm;
if(*(void**)&real_lsm = dlsym(RTLD_NEXT, STR(__libc_start_main)))
return real_lsm(main, ac - 1, av + 1, init, fini, rtld_fini, stack_end);
else
errx(1, "BUG: dlsym: %s", dlerror());
}
$ cc -fPIC -shared -Wall -W -Wno-parentheses skip.c -o skip1.so -ldl
$ cc -fPIC -shared -Wall -W -Wno-parentheses skip.c -o skip2.so -ldl
$ LD_PRELOAD="./skip1.so./skip2.so" /bin/echo a b c d
c d
Это также работает, если вы явно связываете программу с библиотеками skip1.so
и т. д. Вы даже можете execve()
создать совершенно другую программу с совершенно другими аргументами.
[1] Это также работает с musl
, хотя его __libc_start_main
не принимает аргумент rtld_fini
. В uclibc эквивалентной функцией является __uClibc_main
.