0

以下のコマンドを使用して、ファイルからコメント付きの空の行を削除し、特定のパターンを検索しています。

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

上記の式はシェルでは機能しますが、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 を [[:space]] に置き換えても機能しません。Cでこれを機能させる方法を教えてください。

4

2 に答える 2

1

バックスラッシュを 2 倍にし、 、 などに変更し\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 文字列リテラルに\\現れると、単一のバックスラッシュが文字列のその場所に埋め込まれます。

于 2013-03-14T06:57:06.050 に答える
0

\s を POSIX 文字クラス [[:space:]] に置き換えます。

于 2013-03-15T03:57:50.843 に答える