[英]sed-compatible regex matching the middle word of an odd number of words
假设单词的数量总是奇数,那么如何使用正则表达式来捕获奇数个空格分隔单词的中间单词? 任何与sed
兼容的正则表达式都可以,包括扩展( sed -r
)。
例如:(输入🡒捕获)
我怀疑如果没有更强大的正则表达式库(如PCRE)提供的一些扩展,这可能是不可能的。我相信在正则表达式的经典正式语言定义下它是不可能的。
如果用sed
无法做到这一点,那么如何使用不同的正则表达式引擎的功能来完成同样的事情呢?
$ sed -E ':a; s/^[^ ]+ //; s/ [^ ]+$//; ta;' file
apple
one
green
以上假定GNU sed。 对于BSD(OSX)sed,需要进行一些小的修改。
:a
这定义了标签a
。
s/^[^ ]+ //; s/ [^ ]+$//
第一个替换命令从行的开头删除一个单词和一个空格。 第二个从末尾删除空格和单词。
这具有删除行的两端的单词的效果,直到只剩下一个单词。
ta
如果上面的替换命令确实导致替换,则转移到标签a
。
当该行只剩下一个单词时,则替换不执行任何操作,并且分支停止。
使用awk,我们可以直接访问中间词:
$ awk '{print $((NF+1)/2)}' file
apple
one
green
在awk中, NF
是字段数。 如果存在奇数个字段,则根据该问题, (NF+1)/2
是中间字段的编号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.