2016-09-13 3 views
2

私はgrepsedというデータを持つ変数タグを削除しようとしています。私が持っている データは次のようになります。文字列内から正確なタグを削除するために `sed`を変更します。

Please_VB make_VB it_PRP in_IN a_DT range_NN of_IN colored_JJ and_CC precise_JJR Skin_NN tone_NN shades_VBZ 

私の目標は_NNS_NNP_NN_JJ_JJRのタグを持っているだけでそれらの単語を抽出することです。所望の結果について:

grep -oh "\w*_\(JJ\|NN\)\w*" test_file.txt | sed 's/[_JJ\|_NN\|_JJR\|_NNP\|_NNS]//g' 

そのコマンドラインの結果は、しかし、次のとおりです:

range 
colored 
precise 
kin 
tone 
私が今使っている

range 
colored 
precise 
skin 
tone 

grepsed以下であります

grepで正しい単語を正しく抽出しますが、sedは正確なタグではなく対応する文字をすべて削除していますまたは_JXです。 sedはタグ内にある文字ではなく、指定された正確なタグだけを削除するように、より正確にする方法はありますか?

あなたが grepとそれらの値と先読みしてPCRE正規表現抽出してもよい

答えて

2

あなたはcutで(つまり-Pオプションをサポートしていません)POSIX grepを使用することができます。

grep -Eo '\w*_(NN[PS]?|JJR?)' file | cut -d_ -f1 

range 
colored 
precise 
Skin 
tone 

cutは最初のアンダースコアの後の部分を取り除くために使用されます。

2

grep -oP "\w+(?=_(JJR?|NN[PS]?))" 
      ^^^^^^^^^^^^^^^^^^ 

online demo

詳細参照してください:

  • \w+ - 1以上の単語文字を(文字、数字またはアンダースコア)...
  • (?=_(JJR?|NN[PS]?)) -
    • _で続いている - アンダースコアと...
    • (JJR?|NN[PS]?)からJJJJRNNNNPまたはNNSストリング。

-oPPオプションは、PCREのegnineの使用を強制し、oだけで、あなたにマッチを取得します。

関連する問題