修改`sed`以从字符串中删除精确标记

时间:2016-09-13 10:24:02

标签: regex string sed

我正在尝试使用static string PostData(string token, List<KeyValuePair<string, string>> lsPostContent) { string response = String.Empty; try { using (var client = new HttpClient()) { FormUrlEncodedContent cont = new FormUrlEncodedContent(lsPostContent); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var resp = client.PostAsync("https://localhost:61086/api/<your API controller>/", cont); resp.Wait(TimeSpan.FromSeconds(10)); if (resp.IsCompleted) { if (resp.Result.StatusCode == HttpStatusCode.Unauthorized) { Console.WriteLine("Authorization failed. Token expired or invalid."); } else { response = resp.Result.Content.ReadAsStringAsync().Result; Console.WriteLine(response); } } } } catch (Exception ex) { } return response; } grep删除我对数据的变量标记。 我的数据看起来像这样:

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

我现在使用的range colored precise skin tone grep如下:

sed

然而,该命令行的结果是:

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

它正确地使用range colored precise kin tone 提取正确的字词,但grep正在删除所有相应的字母,而不仅仅是sed_NX的确切标记。 有没有什么方法可以使_JX更准确地删除指定的确切标记而不是标记内的任何字母?

2 个答案:

答案 0 :(得分:2)

您可以使用grep和PCRE正则表达式提取这些值并使用前瞻:

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

请参阅online demo

详细

  • \w+ - 一个或多个单词字符(字母,数字或下划线)......
  • (?=_(JJR?|NN[PS]?)) - 随后是
    • _ - 一个下划线和......
    • (JJR?|NN[PS]?) - JJJJRNNNNPNNS子字符串。

P中的-oP选项会强制使用PCRE egnine,o只会为您提供匹配。

答案 1 :(得分:2)

您可以使用grep的POSIX -P(不支持cut选项):

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

range
colored
precise
Skin
tone

cut用于在第一个下划线后删除部分。