我制作了一个实现 printenv |的C程序grep [参数] |排序|少了,但由于某种原因,我在输出开始时得到了一堆换行符。可能是因为我是如何将父进程中的环境变量写入grep进程的。如果我运行myProgram PATH我的结果:
/*40 blank lines */
INFOPATH=/usr/share/info
MANPATH=/usr/local/vol/matlab/7.4.0/man:/usr/kerberos/man:/usr/local/share/man:/usr /share/man/en:/usr/share/man:/usr/man
MODULEPATH=/usr/local/vol/modulefiles:/pkg/modules/modulefiles:/etc/site/modulefiles: /usr/share/Modules/modulefiles:/etc/modulefiles
PATH=/usr/lib/heimdal/bin:/usr/local/vol/comsol/3.4/bin:/usr/local/vol/maple/10.05/bin:/usr/local/vol/matlab/7.4.0/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/opt/real/RealPlayer
WMMENUPATH=/usr/local/vol/maple/menudef/10.05:/usr/local/vol/fvwm2/menudefs/emacs:/usr/local/vol/fvwm2/menudefs/acroread
我正在使用C调用shell程序并将其连接到管道。每个程序(grep,sort,less / more)都在它自己的子进程中调用并通过管道传输给其他程序。父进程通过如下管道将环境变量写入grep:
for(i=0; envp[i]!=NULL; i++)
{
return_value = write(pipe_fd[0][PIPE_WRITE],envp[i], strlen(envp[i]));
errorCheck(return_value, "Cannot write to pipe in parent\n");
return_value=write(pipe_fd[0][PIPE_WRITE],"\n",1);
errorCheck(return_value, "Cannot write to pipe in parent\n");
}
我尝试在排序调用中添加了一堆选项,但到目前为止还没有任何工作。 我的问题是,如果有办法忽略grep或sort行中的多个换行符?
答案 0 :(得分:0)
在读取最终输出块的循环上,执行类似这样的操作
int flag=1;
char prev='\n';
while(fgets(buf, f, sizeof(buf)) {
if (buf[0]='\n' && prev='\n' && flag) next
flag = 0;
如果第一行是单个\ n,则会跳过此行,因此将会跳过任意数量的\ n行
答案 1 :(得分:0)
从输出流中过滤掉空行:
... | grep . | ...
或者,过滤掉只包含空格的任何行:
... | grep '\S' | ...
答案 2 :(得分:0)
使用grep,您可以使用
过滤掉空行grep -v '^$'
使用awk你可以做更多奇特的事情,比如用一个替换多个空行:
awk '/^$/ {if (!e) {e=1;print}} /./ {e=0; print}'
这会产生以下结果:
% (echo hello;echo;echo;echo;echo;echo world) | awk '/^$/ {if (!e) {e=1;print}} /./ {e=0; print}'
hello
world
请注意输出中的单个空行。