1

私は正規表現を使用するのが初めてです。誰かが私を助けてくれることを願っています。以下の正規表現を使用して、正確に 1 つのパイプ文字 (つまり |) を含む文字列の csv ファイルを grep しています。

grep "^([^\\|]+\\|){1}[^\\|]+$" myfile.csv

残念ながら、上記を grep で使用しても結果は得られません。何か案は?

サンプルの csv ファイルの内容は次のとおりです。2 行目が見つかるはずです。

"foo"|"foo"|"foo"

"bar"|"bar"

この質問の解決策:

grep -E "^([^|]+\|){1}[^|]+$" myfile.csv

egrep "^[^|]+\|[^|]+$" myfile.csv
4

5 に答える 5

4

あなたが試すことができます:

^[^|]*\|[^|]*$

|文字クラスでエスケープする必要はありません。また、おそらくhere*の代わりに、 、、などの文字列を単独で使用できるようにする必要があります。+|abcxyz||

于 2013-09-20T02:45:44.310 に答える
1

を使用したソリューションawk

awk 'gsub(/\|/,"|")==1' file

gsub(/\|/,"|")|これは置換された数をカウントし、これが等しい1場合はデフォルトのアクションを実行し、print $0

編集:別の awk:

awk 'split($0,a,"|")==2' file

|printの場合、テキストが によっていくつの部分に分割されているかを数えます2

于 2013-09-20T08:15:47.733 に答える
1

次のことを試してください。

^[^|]+\|[^|]+$

于 2013-09-20T02:47:08.067 に答える
0

ここに私の質問に対する解決策があります。これを解決するために私を導いたコメントに感謝します。

grep -E "^([^|]+\|){1}[^|]+$" myfile.csv

egrep "^[^|]+\|[^|]+$" myfile.csv
于 2013-09-20T13:21:16.457 に答える
0

grep と正規表現は、このタスクには不適切なツールです。カウントを目的としたものを使用します。

# Use a split function with the pipe as delimiter
awk 'split($0, _, "|") == 2 {print}' the_file

# Set awk's field separator to the pipe character
# and check the number of fields on each line
awk -F'|' 'NF == 2 {print}' the_file
于 2013-09-20T19:15:15.667 に答える