2014-04-19 15 views
1

我一直在這個工作了幾天,似乎無法弄清楚,我希望有人可以幫忙。我寧願可以在Linux命令行中運行的答案,如grep,sed的,AWK等如何提取從行首到特定字符串的所有內容?

說我有一個內容爲「file.txt的」文件:

1234jpg.jpg a.jpgbjpgy.jpg uyapss.jpg>"sdf 
5678jpg.jpga.jpgbjpgy.jpg uyapss.jpg>"sdf 
ABC not this line 

我想要做的是提取一切都交給「.JPG」,會給我的結果:

1234jpg.jpg 
5678jpg.jpg 

我試過(數以百計的其他變化之中)一些命令如下:

cat file.txt | sed 's/\(^.*\.jpg\)/\1/' 

cat file.txt | sed -e 's/^[^"jpg"]\(.*\.jpg\)/\1/' 

cat file.txt | egrep '^([^jpg]*[jpg])' 

cat file.txt | grep -Po '\(\K.*jpg\)' 

cat file.txt | grep -Po '(?<=\.jpg).*' 

我很樂意爲此提供任何幫助。

肖恩

+0

你也可以使用'grep'。說'grep -Po'。*?\。jpg'file.txt' – devnull

+0

這個命令不起作用。它使得.jpg後面的所有內容都變成了新的一行,它給了我8個.jpg文件名,而不是位於該行開始處的第2個.jpg文件名,與第一個匹配的.jpg。 – user3552596

+0

我沒有意識到命令中的錨點缺失。它應該是'grep -Po'^。*?\。jpg'file.txt' – devnull

回答

1

試試這個:

$ awk -F"[.]jpg" 'NF>1{print $1".jpg"}' file 
1234jpg.jpg 
5678jpg.jpg 

我們分開使用.jpg作爲字段分隔線。我們只選擇那些有多個這樣的文件的行並打印第一個元素。我們打印擴展名,以便輸出作爲您想要的輸出。

+1

是的,這正是我想要的,謝謝!我可以發佈超過2000個命令,我試圖讓這個工作。 – user3552596

2

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

sed 's/\(\.jpg\).*/\1/' file 

或:

sed -r 's/(\.jpg).*/\1/' file 

或:

sed 's/\.jpg.*/.jpg/' file 
+0

如果我重定向輸出以僅濾出帶有.jpg的行,所有這些命令都可以工作。 sed's/\(\。jpg \)。*/\ 1 /'file | grep「\ .jpg」 謝謝! – user3552596

相關問題