2013-04-05 37 views
-1

對不起,令人困惑的標題,我無法完整地說出我正在嘗試在沒有示例的情況下做什麼。Sed(或awk)替換在列表中找到的主機

我有一串命令,我運行產生的輸出,看起來像以下:

Host_A 
Host_B 
Net_X 
Group_Y 

等等等等

我想然後採取輸出,並將其送入sed,以便它將使用新字符串(如Host_Q)替換在前一個列表中找到的任何字符串實例。

sed 's/Host_A/Host_Q/g' 

工作正常,但我想避免必須手動爲每個主機寫一個sed字符串。

謝謝!

編輯:更好的例子

grep的流產生:

Host_A 
Host_B 
Host_C 
Host_D 
+lots more 

我想的是用grep流sed的管,並且已經sed的與新的(雖然相同)主機名替換那些主機的所有實例。

Editx2:另外,列表是動態的。因此,每種類型都是針對一個新文件運行的,內容會有所不同,這就是爲什麼我不能(也不想)對原始值進行硬編碼。

編輯:::

我想出了我自己,對不起的傢伙。

我正在流,像這樣:

awk '{print "sed \x27s\/"$1"/HOST_Q/g\x27"}' 

對不起,被如此該死的混亂

+0

這是一個http://stackoverflow.com/questions/15829445/multiple-regex-replacements-based-on-lists-in-multiple-files的副本,或者至少可以找到這個問題的解決方案線。 – 2013-04-05 15:44:17

+1

您的問題不明確,我不確定自己的理解是否正確,您是否可以更具體? – 2013-04-05 15:45:48

+0

編輯是否更好? – Numpty 2013-04-05 15:50:03

回答

1

你想要把多個替換字符串這樣在相同的命令?

mycommands | sed ' 
s/Host_A/Host1/g 
s/Host_B/Host2/g 
s/Net_X/Net1/g 
s/Group_Y/Group2/g' 

或者要創建這樣的命令文件:

#!/bin/sed -f 
s/Host_A/Host1/g 
s/Host_B/Host2/g 
s/Net_X/Net1/g 
s/Group_Y/Group2/g' 

保存此腳本,如「chgnames」,並使其可執行文件,你可以用簡單的命令使用一個文件:

mycommands | ./chgnames

+0

我看到你只是修改你的問題:) – kevro 2013-04-05 15:54:21

+0

是啊,對不起:) - 應該是's/*/Host_Q/g'爲他們很多 – Numpty 2013-04-05 15:56:02

1
sed 's#^\(Host_A\|Host_B\)$#Host_Q#' 

那?

+0

這太具體了。我希望從grep的輸出中轉換所有內容。整點是*不*必須鍵入列表的原始內容。 – Numpty 2013-04-05 15:57:00

+0

現在我們又回到原點了。如果您將輸出中的「everything」替換爲Host_Q,那麼爲什麼您首先想到了?我的猜測是你的問題是錯誤的,你的輸出不只是顯示主機名的一列,因爲這樣做絕對沒用,只需要輸出Host_Q x次輸出grep的行。請詳細說明:-) – 2013-04-05 16:00:20

+0

另一個瘋狂的猜測:您的目標是採取此列表並將這些主機名替換爲_another_文件中的Host_Q? – 2013-04-05 16:02:17