繁体   English   中英

sed兼容的正则表达式匹配奇数个单词的中间单词

[英]sed-compatible regex matching the middle word of an odd number of words

假设单词的数量总是奇数,那么如何使用正则表达式来捕获奇数个空格分隔单词的中间单词? 任何与sed兼容的正则表达式都可以,包括扩展( sed -r )。

例如:(输入🡒捕获)

  • “apple”🡒“apple”
  • “零一二”🡒“一”
  • “红蓝绿橙黄”🡒“绿”

我怀疑如果没有更强大的正则表达式库(如PCRE)提供的一些扩展,这可能是不可能的。我相信在正则表达式的经典正式语言定义下它是不可能的。
如果用sed无法做到这一点,那么如何使用不同的正则表达式引擎的功能来完成同样的事情呢?

使用sed

$ sed -E ':a; s/^[^ ]+ //; s/ [^ ]+$//; ta;' file
apple
one
green

以上假定GNU sed。 对于BSD(OSX)sed,需要进行一些小的修改。

这个怎么运作

  • :a

    这定义了标签a

  • s/^[^ ]+ //; s/ [^ ]+$//

    第一个替换命令从行的开头删除一个单词和一个空格。 第二个从末尾删除空格和单词。

    这具有删除行的两端的单词的效果,直到只剩下一个单词。

  • ta

    如果上面的替换命令确实导致替换,则转移到标签a

    当该行只剩下一个单词时,则替换不执行任何操作,并且分支停止。

使用awk

使用awk,我们可以直接访问中间词:

$ awk '{print $((NF+1)/2)}' file
apple
one
green

在awk中, NF是字段数。 如果存在奇数个字段,则根据该问题, (NF+1)/2是中间字段的编号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM