2014-05-16 29 views
0

我有一個bash腳本來創建一個文本文件,然後用sed命令來處理它。但是,有時會有一行包含多個括號。如何在bash中用多個圓括號過濾文本?

例如:

fileInfo: (2014) (b2b) (analog) (digital) (some-text) 

這條線可能是少1套(),但通常至少2到最後我只在提取最後一組()

感興趣
fileInfo: (some-text) 

如果存在()的設置數量,我可以讓它工作,但不是每個文件都不一樣時。

直到我遇到了2套以上的文件()以下已工作:

if grep -q "textInfo: (.*) (.*)" "$TXT"; then 
    SG=`egrep textInfo "$TXT" | sed "s/.*) (//"| sed "s/)$//"` 
else 
    SG=`egrep textInfo "$TXT" | sed "s/.* (//"| sed "s/)$//"` 
fi 
+0

這是相當微不足道的。盡一些努力。你會發現很多這樣的例子。 – devnull

+0

我一直在尋找,並找到了一個合適的例子,我不會發布。 –

+0

@GregKuhn,告訴我們你試過了什麼。 – bedwyr

回答

1

嘗試此GNU sed命令,

sed -r 's/^([^ ]+)()+.*\((.*)\)/\1\2(\3)/g' file 

實施例:

$ echo 'fileInfo: (2014) (b2b) (analog) (digital) (some-text)' | sed -r 's/^([^ ]+)()+.*\((.*)\)/\1\2(\3)/g' 
fileInfo: (some-text) 
  • ^([^ ]+) - 匹配和存儲一個或多個字符,這是不是一個空間,並將其存儲到第一組(一旦它找到一個空間,sed的停止擷取字符)

  • ()+ - 匹配的一個或多個空間字符並將其存儲到第二組中。一旦sed找到不能空格字符的字符,它會突然停止提取。

  • .*\( - 匹配任何字符直到文字(。通常sed匹配最後的(,如果一行包含多個(

  • (.*)\) - 獲取最後的()括號內的字符並將其存儲到第三組中。

  • \1\2(\3) - 最後使用反向引用,sed用這些提取的組替換整行。

+0

完美地工作!現在我需要分解它以瞭解它在做什麼,那麼它更容易。謝謝 –

+0

你想我解釋嗎? –

+0

如果你有時間和傾向於這樣做,否則我會嘗試自己的 –

1

正則表達式可以做到這一點

我不是SED的專家,但可能這個代碼捕獲最後一個版本中的文本。你只需要添加你需要的其他固定文本。

sed -n '/\(([^)]+)\)$/p' 
1

使用bash正則表達式:

s='fileInfo: (2014) (b2b) (analog) (digital) (some-text)' 
[[ "$s" =~ ^([^:]+:).*(\([^()]*\))[^()]*$ ]] && echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}" 
fileInfo: (some-text) 
0

使用sed

$ sed -r 's/([^ ]+ +).*(\(.*)/\1 \2/' file 
fileInfo:  (some-text) 
+1

發佈downvote的原因。 –

1

這可能爲你工作(GNU SED):

sed 's/:.*(/:(/' file 

刪除一切從:到最後(然後更換:(

N.B. .*是貪婪的,並始終針對最長的匹配。

相關問題