如何防止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:请显示您有什么证据来支持您的上一个陈述(“这没有发生”)。