Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止c解释sed的\s_C_Sed - Fatal编程技术网

如何防止c解释sed的\s

如何防止c解释sed的\s,c,sed,C,Sed,我使用下面的命令从文件中删除已注释的空行,并搜索特定模式 sed '/#/d' $file | sed '/^[ ]*$/d' | tr -d '\n' | sed -n 's/^.*tags\s*[{]\s*hosttags\s*=\s*\([0-1]\)\s*[}].*/tags {hosttags = \1}/p' 虽然上面的表达式在shell中适用,但我必须在C中使用它。问题在于这一行 sprintf(buf, "sed '/#/d' %s | sed '/^[ ]*$/d' |

我使用下面的命令从文件中删除已注释的空行,并搜索特定模式

sed '/#/d' $file | sed '/^[  ]*$/d' | tr -d '\n' | sed -n 's/^.*tags\s*[{]\s*hosttags\s*=\s*\([0-1]\)\s*[}].*/tags {hosttags = \1}/p'
虽然上面的表达式在shell中适用,但我必须在C中使用它。问题在于这一行

sprintf(buf, "sed '/#/d' %s | sed '/^[  ]*$/d' | tr -d '\n' | sed -n 's/^.*tags\s*[{]\s*hosttags\s*=\s*\([0-1]\)\s*[}].*/tags {hosttags = \1}/p'",file);
C尝试解释\s,但编译失败。用[[:空格]]替换\s无效。
请让我知道如何在C语言中工作。

将反斜杠加倍,将
\n
更改为
\\n
\s
更改为
\\s
,等等:

sprintf(buf, "sed '/#/d' %s | sed '/^[  ]*$/d' | tr -d '\\n' | sed -n 's/^.*tags\\s*[{]\\s*hosttags\\s*=\\s*\\([0-1]\\)\\s*[}].*/tags {hosttags = \\1}/p'",file);

\\
以C字符串文字显示时,字符串中会嵌入一个反斜杠。

用POSIX字符类[[:空格:]替换\s。

顺便说一句;你的命令行看起来效率很低。我相信您只需调用一次sed就可以成功。您的sed调用将删除所有包含
符号的行!这与“评论空行”大不相同!如果我使用反斜杠,那么我就是在保护它不被C解释。但是shell(而不是sed)也不能正确解释它,并且命令无法获得正确的输出。我需要的是一个命令/特殊字符,这样\s就不能用C解释。但它应该用sed解释。对于sed中的eg\s应该与just\s相同。@user2161443:这正是这个答案所提供的。我认为您可能误判了问题。当\\出现在C字符串文字中时,字符串中会嵌入一个反斜杠。-->这没有发生。@user2161443:请显示您有什么证据来支持您的上一个陈述(“这没有发生”)。