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
- 第七行:
toif($i在a中)
if($i==a[FNR])
grep-oP.*\b(两个詹妮弗)(\s\s+)”
我又编辑了一遍,谢谢。我猜-P
不是必需的?不,只是习惯使用它而不是-E
!如果没有匹配项,则不会打印任何内容。再说一次,也许这是需要的?@JamesBrown Easy fix如果不是grep-Po.*\b(两个|詹妮弗)(\s+\s+?| ^.*'