2011-12-17 126 views
0

我有幾個文件名爲不同的語言。我需要grep或sed只是語言部分。我正在使用gconftool-2 -R /,並且希望通過管道命令來顯示帶有該語言的字母。如何sed/grep文件名中的最後一個單詞?

active = file.so,sv.xml 
active = file.so,en_GB.xml 
active = file.so,en_US.xml 

我需要的文件的sven_GB一部分。我怎樣才能以最有效的方式做到這一點?我在想像gconftool-2 -R/| sed -n -e '/active =/p̈́' -e '/\.$/'之類的東西,但後來我卡住了,因爲我不知道如何只打印我需要的部分而不是整個線。

+0

已經更新了基於新的答案輸入。希望有所幫助! – 2011-12-17 20:47:45

回答

2

如何使用簡單的cut

cut -d. -f3 filename 

測試:

[jaypal:~/Temp] cat filename 
active = file.so.sv.xml 
active = file.so.en_GB.xml 
active = file.so.en_US.xml 

[jaypal:~/Temp] cut -d. -f3 filename 
sv 
en_GB 
en_US 

基於更新輸入:

[jaypal:~/Temp] cat filename 
active = file.so,sv.xml 
active = file.so,en_GB.xml 
active = file.so,en_US.xml 

[jaypal:~/Temp] cut -d, -f2 filename | sed 's/\..*//g' 
sv 
en_GB 
en_US 

OR

使用awk

[jaypal:~/Temp] awk -F[,.] '{print $3}' filename 
sv 
en_GB 
en_US 

[jaypal:~/Temp] awk -F[,.] '{print $(NF-1)}' filename 
sv 
en_GB 
en_US 

OR

使用greptr

[jaypal:~/Temp] egrep -o ",\<.[^\.]*\>" f | tr -d , 
sv 
en_GB 
en_US 
+0

謝謝!那樣做了。應該更加註意','。 ;) – AlMehdi 2011-12-17 21:04:57

0

嘗試:

gconftool-2 -R/| grep '^active = ' | sed 's,\.[^.]\+$,,; s,.*\.,,'

第一sed命令說要刪除一個點,然後一切不是一個點,直到行的結束;第二個說去除一切,直到最後一個點。

5
awk -F. '{print $(NF-1)}' 

NF是字段數,awk從1開始計數,所以第二個到最後一個字段是NF-1。
-F。說田地被「分開」。而不是空白

+0

啊,是的,awk ...順便說一句,你可以添加'/^active = /',因爲OP過濾器和'sed'一樣。好一個! – fge 2011-12-17 20:05:23

+0

@fge - awk總是比sed更簡單(比'C'更像)。如果你是perl/lisp類型,可能會有所不同 – 2011-12-17 20:07:50

+0

@fge - 活動部分應該不重要,因爲我們從結尾計數字段 – 2011-12-17 20:09:04

1

awk將是我這一任務的主要工具,但既然已經被提出,我會添加使用cut代替

cut -d. -f3 

即使用.作爲分隔符,選擇第三個領域的解決方案。

既然你bash標籤的問題,我將添加一個純bash的解決方案,以及:

#!/usr/bin/bash 

IFS=. 

while read -a LINE; 
do 
    echo ${LINE[2]} 
done < file_name 
0

這可能會爲你工作:

gconftool-2 -R/| sed -n 's/^active.*,\([^.]*\).*/\1/p' 
相關問題