Sed、awk或posixshell来填充规范页面中的空定义系列
我经常发现自己不得不使用POSIX规范页面errno.h就是一个很好的例子,复制粘贴它们,然后填写所有的定义。如何将另一个文件的匹配定义剥离到POSIX页面,以填充POSIX spec页面上缺少的数字字段,并将其转换为库: 源自 errno的POSIX规范页面如下所示: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
[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,因此错误代码将取决于编译器标志等。。。