Sed、awk或posixshell来填充规范页面中的空定义系列

Sed、awk或posixshell来填充规范页面中的空定义系列,shell,awk,sed,Shell,Awk,Sed,我经常发现自己不得不使用POSIX规范页面errno.h就是一个很好的例子,复制粘贴它们,然后填写所有的定义。如何将另一个文件的匹配定义剥离到POSIX页面,以填充POSIX spec页面上缺少的数字字段,并将其转换为库: 源自 errno的POSIX规范页面如下所示: [E2BIG] Argument list too long. [EACCES] Permission denied. [EADDRINUSE] Address in use. [EADDRNOTAVAI

我经常发现自己不得不使用POSIX规范页面errno.h就是一个很好的例子,复制粘贴它们,然后填写所有的定义。如何将另一个文件的匹配定义剥离到POSIX页面,以填充POSIX spec页面上缺少的数字字段,并将其转换为库:

源自 errno的POSIX规范页面如下所示:

[E2BIG]
    Argument list too long.
[EACCES]
    Permission denied.
[EADDRINUSE]
    Address in use.
[EADDRNOTAVAIL]
    Address not available.
[EAFNOSUPPORT]
    Address family not supported.
[EAGAIN]
    Resource unavailable, try again (may be the same value as [EWOULDBLOCK]).
[EALREADY]
    Connection already in progress.
[EBADF]
    Bad file descriptor.
[EBADMSG]
    Bad message.
#define E2BIG           7       /* Argument list too long.              */
#define EACCES          13      /* Permission denied.                   */
#define EADDRINUSE      98      /* Address in use.                      */
#define EADDRNOTAVAIL   99      /* Address not available.               */
#define EAFNOSUPPORT    97      /* Address family not supported.        */
#define EAGAIN          11      /* Resource unavailable, try again .... */
#define EALREADY        114     /* Connection already in progress.      */
然后说,可能需要从已知的库矿山中填写这些值,这一个已经完成,并使其看起来像这样:

[E2BIG]
    Argument list too long.
[EACCES]
    Permission denied.
[EADDRINUSE]
    Address in use.
[EADDRNOTAVAIL]
    Address not available.
[EAFNOSUPPORT]
    Address family not supported.
[EAGAIN]
    Resource unavailable, try again (may be the same value as [EWOULDBLOCK]).
[EALREADY]
    Connection already in progress.
[EBADF]
    Bad file descriptor.
[EBADMSG]
    Bad message.
#define E2BIG           7       /* Argument list too long.              */
#define EACCES          13      /* Permission denied.                   */
#define EADDRINUSE      98      /* Address in use.                      */
#define EADDRNOTAVAIL   99      /* Address not available.               */
#define EAFNOSUPPORT    97      /* Address family not supported.        */
#define EAGAIN          11      /* Resource unavailable, try again .... */
#define EALREADY        114     /* Connection already in progress.      */
我的awk和sed都很平庸,所以我花了大约一个小时来完成这些简单的图书馆页面,然后我还要用肉眼检查

对这一问题的澄清:

[E2BIG]变大了 定义E2BIG变为定义E2BIG 7 “E2BIG”匹配,其值从已知库页面填充 define E2BIG变为define E2BIG/*参数列表过长*/ 下面一行上的句子转换为/*C注释*/并与上面一行连接,这是它对应的define。
这里我假设spec文件严格地在spec字符串和注释之间交替,每个注释只有一行,如示例中所示

首先,我们加载一个数组,其中包含规范字符串和值文件中的值。然后从spec文件中检查数组中是否有spec字符串,如果有,打印出信息,否则忽略它

$1=$1赋值只是用来从注释中删除额外的空格

最后,马克·塞切尔(MarkSetchell)在他的上述评论中提出了一个很好的观点,所以要小心

$ cat none.awk
# reading values:
NR == FNR && $1 == "#define" && $3 ~ /[0-9]+/ { val[$2] = $3 }
NR == FNR {  next }

# reading spec:
NF == 1 && /^\[.*\]$/ { gsub(/\[|\]/,"",$0); s = $0; next }
s in val { $1 = $1; printf "#define %s\t%d\t/* %s */\n", s, val[s], $0 }    


$ cat values.txt
/*
 * Error codes
 */

#define EPERM       1       /* Operation not permitted */
#define ENOENT      2       /* No such file or directory */
#define ESRCH       3       /* No such process */
#define EINTR       4       /* Interrupted system call */
#define EIO     5       /* Input/output error */
#define ENXIO       6       /* Device not configured */
#define E2BIG       7       /* Argument list too long */
#define ENOEXEC     8       /* Exec format error */
#define EBADF       9       /* Bad file descriptor */
#define ECHILD      10      /* No child processes */
#define EDEADLK     11      /* Resource deadlock avoided */
                    /* 11 was EAGAIN */
#define ENOMEM      12      /* Cannot allocate memory */
#define EACCES      13      /* Permission denied */
#define EFAULT      14      /* Bad address */


$ cat spec.txt
[E2BIG]
    Argument list too long.
[EACCES]
    Permission denied.
[EADDRINUSE]
    Address in use.
[EADDRNOTAVAIL]
    Address not available.
[EAFNOSUPPORT]
    Address family not supported.
[EAGAIN]
    Resource unavailable, try again (may be the same value as [EWOULDBLOCK]).
[EALREADY]
    Connection already in progress.
[EBADF]
    Bad file descriptor.
[EBADMSG]
    Bad message.


$ awk -f none.awk values.txt spec.txt 
#define E2BIG   7   /* Argument list too long. */
#define EACCES  13  /* Permission denied. */
#define EBADF   9   /* Bad file descriptor. */

你能澄清这个问题吗?还不完全清楚您试图用awk/sed实现什么。请告诉我们更多关于这个已知库页面的信息,该页面包含您的说明中的值7。是本地文件吗?它有什么格式?你能在你的问题中包含一个例子作为输入吗?那么你在errno.h中已有的和你试图作为输出得到的有什么区别?但是定义的值取决于其他宏,因此,您可能需要if definedKERNEL define EOPNOTSUPP 102 else define EOPNOTSUPP 67 endiif,因此错误代码将取决于编译器标志等。。。