2017-09-13 43 views
0

我想管道貓輸出文件到sed模式。 假設我有2個文件:color.txt和duplicate.txt。 color.txt包含3種顏色:藍色,綠色,紅色和duplicate.txt包含綠色。 我想使用sed從color.txt文件中刪除綠色。如何管道貓到sed模式

我嘗試這樣:

cat duplicate.txt | sed "/$/d" < color.txt 

不幸的是,這是行不通的。任何建議如何做到這一點?

+1

* nix utils通常可以處理文件,並且以這種方式使用cat廣泛地被認爲是「[UUOC](http://porkmail.org/era/unix/award.html)」... a「無用的貓「。正如你會在答案中看到的(到目前爲止)他們通常不使用'cat'。 –

回答

0

我想你的意思是這樣的:

sed "/$(cat duplicate.txt)/d" color.txt 

但是,因爲你可以從評論說,這種做法不是很明智。我敦促你使用其他解決方案之一。儘管我不會刪除這個答案,因爲它顯示了你想學習的技巧。

+2

如果duplicate.txt有多行,這不會給語法錯誤嗎?另外,它也會刪除部分匹配的行。不知道這是OP想要的。 – codeforester

+0

@codeforester是的,我把問題的意思是隻有一行,因爲給出的例子和它被稱爲*「重複」*而不是*「重複」*的事實。雖然我猜這個邏輯,它應該是*「colors.txt」*但它不是:-) –

+0

部分匹配可以通過添加字邊界來克服,但OP在這個問題上不是特定的。我試圖演示OP所要求的技術 - 即如何將文件的內容用作「sed」的模式。我同意你的解決方案在技術上更加準確,我的觀點更接近OP似乎試圖實現的概念 - 以標題爲標題。我會爲你投票 –

2

您可以使用grep達到你想要的東西:

grep -Fxvf duplicate.txt color.txt 
  • -F來治療duplicate.txt行字符串而不是模式
  • -x在color.txt
  • 匹配整行
  • -v來提取不匹配的行
  • -f將字符串從duplicate.txt中提取到與color.txt匹配

無論您的文件有多少模式,這都可以工作。對於非常大的文件,你可能想看看這篇文章:

2

而在這種情況下,grep的解決方案是不夠的,有時我用這樣的命令:

sed 's|.*|/^\1$/d|' duplicate.txt | sed -i -f - color.txt

這裏先sed調用轉換將每行從duplicate.txt轉換爲適當的sed命令以刪除所需的內容。這會產生一個sed腳本,然後使用-f -傳遞給第二個sed,其中-文件名稱表示標準輸入。