2012-07-18 117 views
2

我想用另一個文件中的字符串替換一個文件中的一個字符串。雖然我對這些命令沒有經驗,但我希望grep和sed的組合能夠做到最好。使用grep和sed將另一個字符串替換爲另一個字符串

是什麼讓這有點複雜是我不知道什麼字符串是(我試圖自動替換我的文檔版本號)。我知道在這兩種情況下,我正在尋找的字符串(比如「2.3.4」)之前是「版本號:」

所以,我可以說'尋找單詞(或其他行或任何可能的)在「version:」後面(我們稱之爲string1),然後在另一個文件中執行相同的操作(給出string2),並用string2替換string1。

下面是一些示例文本文件:

FILE1.TXT

這是包含
更新的版本號的文件。
版本:2.3.4
這裏有更多信息的字符串

FILE2.TXT

這是一個配置文件
它可以包含一箇舊版本號
版本:2.3 .2
請更新此信息

所以對於FILE2.TXT預期輸出將成爲:

FILE2.TXT

這是一個配置文件
它可以包含一箇舊版本號
版本:2.3.4
請更新這

感謝

+0

您能否給我們一些意見? – Debaditya 2012-07-18 08:28:57

+1

很難找到需要'grep'和'sed'的情況。如果'grep'足夠強大,則不需要'sed',如果不需要,'sed'幾乎可以執行'grep'可以做的所有事情(儘管有時會受到折磨)。 – tripleee 2012-07-18 08:40:53

+0

@編年史當然,看編輯問題 – user1488804 2012-07-18 08:46:40

回答

2

只要你有一個sed它支持-i選項,

sed -i 's/version: .*/version: 1.2.3/' file1 file2 file3 ... 

您可能需要調整正則表達式通配符; .*通過行尾匹配,而[.0-9]*匹配最長的點和數字序列。您可能還想允許周圍空白的變化......但是,因爲這可能是本網站上10%的常見問題解答之一,請在此處查找類似的問題。

從文件1獲得替換字符串,並將其應用到file2,file3的,等等,類似

new=$(sed -n 's/version: //p' file1) 
# Use double quotes, not single, in order to expand $new 
sed -i "s/version: [.0-9]*/version: $new/" file2 file3 ... 

第一sed調用將只在其「版本:」打印線被發現和刪除(更換用空字符串)。據推測,文件中只會有這樣一行。輸出到head -n 1uniq什麼的,或找到/創建一個更詳細的sed腳本。

您通常使用單引號圍繞文字字符串,但由於您不希望文字$new置換,因此我們使用雙引號,它允許shell執行變量替換(還有一些其他替換我們不' t進入這裏)在引用的字符串。

+0

我不認爲新版本是已知的。 – 2012-07-18 08:21:03

+0

是的,如果我沒有說清楚,很抱歉。版本號都不是已知的,因爲它們會定期更新,並且理想情況下不希望每次更改版本都手動更改此腳本。 – user1488804 2012-07-18 08:48:36

+0

感謝您的回覆。當我運行這個時,我發現整個'file1'被插入到'file2'中,而不是版本號行。所以我猜測,變量'new'有一些問題,這意味着它不僅僅需要一行 – user1488804 2012-07-18 10:11:50

2

這對你適合嗎?

kent$ head f1 f2 
==> f1 <== 
This is a file containing 
the updated version number. 
version: 2.3.4 
here is a string with more info 

==> f2 <== 
This is a configuration file 
It could contain an old version number 
version: 2.3.2 
Please update this 

kent$ awk 'NR==FNR{if($0~/^version:/){x=$0;} next;}{gsub(/^version:.*$/,x);print $0}' f1 f2 
This is a configuration file 
It could contain an old version number 
version: 2.3.4 
Please update this 
+0

正是使用你寫的我的f2.txt保留了舊的版本號。在命令行中,所有的文件都打印在一行中(即它們不保留其格式)。我害怕我不熟悉awk。這個命令是否對文件進行更改,或者只是對打印的文本進行更改? – user1488804 2012-07-18 10:00:09

+0

@ user1488804正如你在我的答案中看到的,它在這裏工作。這裏是Linux上的gawk 3.1.6。上面的awk行不會改變你的file2,它會在控制檯上打印輸出。 – Kent 2012-07-18 10:07:32

+0

好的。那麼awk命令是不可轉移的呢? (我正在使用Mac命令行)。如何更改代碼以使版本更新實際更改文本文件?謝謝 – user1488804 2012-07-18 10:14:36

相關問題