簡體   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