Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何删除下一个匹配正则表达式的单词后的所有内容?_Bash_Awk_Sed - Fatal编程技术网

Bash 如何删除下一个匹配正则表达式的单词后的所有内容?

Bash 如何删除下一个匹配正则表达式的单词后的所有内容?,bash,awk,sed,Bash,Awk,Sed,我正在尝试删除匹配模式后行末尾的所有字段,并且还想打印模式的下一个字段。 可能有多种模式 示例: one two three four five six seven robin mike luke jennifer jessie mark ... two jennifer one two three robin mike luke jennifer jessie ... 模式: one two three four five six seven robin mike luke jennif

我正在尝试删除匹配模式后行末尾的所有字段,并且还想打印模式的下一个字段。 可能有多种模式

示例:

one two three four five six seven
robin mike luke jennifer jessie mark
...
two
jennifer
one two three
robin mike luke jennifer jessie
...
模式:

one two three four five six seven
robin mike luke jennifer jessie mark
...
two
jennifer
one two three
robin mike luke jennifer jessie
...
输出:

one two three four five six seven
robin mike luke jennifer jessie mark
...
two
jennifer
one two three
robin mike luke jennifer jessie
...
我试过:

cat file | sed -E 's/(.+ two|jennifer) .+/\1 /'
one two
robin mike luke jennifer

但是我错过了下一个领域。

因为看起来您可以访问GNU工具,我建议您使用grep:

grep -Eo '.*\b(two|jennifer)(\s+\S+)?' file
这将匹配字段“2”或“jennifer”之前的任何内容,然后是下一个字段(如果存在)。感谢您的宝贵建议

-o
仅打印行的匹配部分,而
-E
启用扩展正则表达式。

在awk中:

$ awk 'NR==FNR{a[$1];next}{for(i=1;i<=NF;i++) if($i in a) NF=((i+1)>NF?NF:(i+1))} 1' pats ex
one two three
robin mike luke jennifer jessie
当前程序检查是否在哈希
a
中找到单词。这意味着在处理第一条记录时,它会检查它是否有
two
jennifer
。如果不需要,可以通过更换

  • 第二行:
    a[$i]
    a[FNR]=$1
  • 第七行:
    if($i在a中)
    to
    if($i==a[FNR])

将匹配包含两个或多个字段的字段。如果选择第一个或最后一个字段,编辑也将失败。也许
grep-oP.*\b(两个詹妮弗)(\s\s+)”
我又编辑了一遍,谢谢。我猜
-P
不是必需的?不,只是习惯使用它而不是
-E
!如果没有匹配项,则不会打印任何内容。再说一次,也许这是需要的?@JamesBrown Easy fix如果不是
grep-Po.*\b(两个|詹妮弗)(\s+\s+?| ^.*'