ユースケースは非常に簡単です。次の名前のテキストファイルがありますeg.txt
。
'simple_example': 345, 'to_demonstrate': 232,
'regex': '使いやすくない'
キーをキャプチャしようとしています。
grep -oP (?<=')[a-zA-Z_0-9]+(?=':) eg.txt
エラーが発生します。
-bash: 予期しない表示 "(") の近くで構文エラーが発生しました。
一重引用符をエスケープしても役に立ちません。
grep -oP (?<=\')[a-zA-Z_0-9]+(?=\':) eg.txt
拡張grepを使用しても役に立ちません。
grep -oE (?<=')[a-zA-Z_0-9]+(?=':) eg.txt
ここで何が起こっているのでしょうか?私はWindows 10 WSLでLinux bashを使用しています。
答え1
エラーメッセージが解決する問題は、一重引用符ではなく括弧です。引用符で囲まれていない括弧はシェルに特有であり、その意味はコマンドラインの位置によって異なります。引用符のない一重引用符と入力リダイレクト演算<
子返品問題があるため、シェルがそれをシェル構文として解釈しないように完全正規表現を引用することをお勧めします。
grep -P -o "(?<=')[a-zA-Z_0-9]+(?=':)" eg.txt
式に一重引用符が含まれ、一重引用符で囲まれた文字列に一重引用符を含めることはできないため、二重引用符を使用して式全体を引用しました。
入力が正しい形式のJSONドキュメントである場合(キーと値に二重引用符を使用)、JSONパーサーを使用して最上位キーを取得する方が簡単です。たとえば、次のようになりますjq
。
$ cat file
{
"simple_example": 345,
"to_demonstrate": 232,
"regex": "is not easy to use"
}
$ jq -r 'keys[]' file
regex
simple_example
to_demonstrate
これは、最上位キーを配列に抽出し(使用してkeys
)、その配列をコレクションに展開して[]
出力デコードします(つまり、エンコードされたJSON文字列ではなく「生」文字列として-r
)。