2

「x」の前にスペース文字以外の非スペース文字"と任意の数のスペース文字が続く場合、「x」に一致する正規表現があります。

[^"\s]\s*x

これはJavaScriptで期待どおりに機能します。

$ node
> /[^"\s]\s*x/.test('x')
false
> /[^"\s]\s*x/.test(' x')
false
> /[^"\s]\s*x/.test('" x')
false
> /[^"\s]\s*x/.test(': x')
true

ただし、grepの動作は異なります。

$ echo 'x' | grep '[^"\s]\s*x'

$ echo ' x' | grep '[^"\s]\s*x'
 x

$ echo '" x' | grep '[^"\s]\s*x'
" x

$ echo ': x' | grep '[^"\s]\s*x'
: x

この動作の説明はありますか?grepの正規表現を書き直して、意​​図したとおりに動作するようにするにはどうすればよいですか?

4

2 に答える 2

4

このページによると、内部のバックスラッシュ[]は文字通りに解釈されます。したがって、否定グループは「引用符やスペース文字ではなく」ではなく、「引用符、円記号、またはsではありません」。

[^"[:space:]]代わりに試してみませんか?

于 2013-02-17T05:40:29.647 に答える
3

-PオプションとPerl互換になるようにgrepに指示できます。

$ echo 'x' | grep -P '[^"\s]\s*x'

$ echo ' x' | grep -P '[^"\s]\s*x'

$ echo '" x' | grep -P '[^"\s]\s*x'

$ echo ': x' | grep -P '[^"\s]\s*x'
: x

-P編集:スイッチを取り外した後のMacでは不可能

于 2013-02-17T05:50:45.817 に答える