2015-02-08 141 views
0

我是UNIX新手,正在練習shell腳本。我有一個應用程序,我需要字符串搜索和替換。讀取一個字符串直到關鍵字,並用UNIX中的另一個字符串替換字符

文件1和文件2中有一些行。我有一個搜索關鍵字。

文件1:如果鍵詞存在於文件1和文件然後在2文件2中的鍵字後的刺痛應與該串中文件1.

的關鍵詞例如後更換:

abc def ghi jkl **unix** is the key 
This file contains 3 lines and **unix** is the key 

文件2:

This is a sample sentence **unix** in the second file 
This is line 2 and **unix** the new line in the second file 

的關鍵詞是「UNIX」。這裏UNIX後的字符串中的文件的文件1爲「是關鍵」,所以「UNIX」之後的字符串中文件2即「在s第二個文件「應該替換爲」是關鍵「。因此字符串讀取和替換後的文件的輸出應該像

文件1:

abc def ghi jkl **unix** is the key 
This file contains 3 lines and **unix** is the key 

文件2:

This is a sample sentence **unix** is the key 
This is line 2 and **unix** is the key 

我用單獨以下命令

grep sed awk 

但我無法弄清楚如何可以結合搜索和替換。 任何人都可以告訴我如何完成上述任何建議或幫助表示讚賞。

在此先感謝

+1

你打算如何調用腳本? 'mangle unix file1 file2'?你如何處理'file1'包含一行'blah unix是關鍵'的情況,另一個說法是'blah blah unix是萬能藥'? 'file1'中的第二行(和後續行)的含義是什麼?如果'file1'在第一行或任何行中不包含關鍵字會發生什麼?據推測,'file2'中不包含關鍵字的行將保持不變?問題的規範尚未完整 - 這可能是您難以展示自己嘗試過的原因的原因。 – 2015-02-08 17:37:29

+0

這只是一個例子。考慮兩個包含共同密鑰的字符串。第一個關鍵字後面的字符串應該被第二個關鍵字後面的字符串替換。如果關鍵詞不存在,請保持原樣。我是unix的新手,所以我無法弄清楚方法。 – user168983 2015-02-08 17:49:18

+2

最大的問題(在我看來)是「file1'中第二行和後續行的目的是什麼?」我不知道你想用他們做什麼。他們應該被忽略嗎?是否應該驗證它們以確保它們與第一行具有相同的結尾文本?你可能是一個新手,但這並不妨礙你思考。 – 2015-02-08 17:58:12

回答

0

對於Unix基本的工具,這是最簡單的Perl中我。這將演示基本的方法和引用;如果您願意,您可以替換其他工具。

鑑於這些文件:

$ cat /tmp/f1.txt 
abc def ghi jkl **unix** is the key 
This file contains 3 lines and **unix** is the key 

$ cat /tmp/f2.txt 
This is a sample sentence **unix** in the second file 
This is line 2 and **unix** the new line in the second file 

首先,讓我們的關鍵是:

$ key=$(perl -lne 'if (/^.*\*\*unix\*\*(.+)$/) {print $1; exit;} ' /tmp/f1.txt) 

注意周圍通話與$()這對Perl執行命令(在這種情況下,Perl的一個班輪)並將輸出分配給變量key

$ echo "$key" 
is the key 

(注意周圍"$key""使得打印的前導空格...)

現在更換串線,以線在第二個文件:

$ perl -ple "s/(.*\*\*unix\*\*)(.*)/\1$key/" /tmp/f2.txt 
This is a sample sentence **unix** is the key 
This is line 2 and **unix** is the key 

注意在第二次調用Perl時使用"而不是'。這允許從Bash中的命令行替換使用值$key

如果你想設置一個猛砸變量與您的目標的關鍵:

$ tgt='\*\*unix\*\*' 
$ key=$(perl -lne "if (/^.*$tgt(.+)/) {print \$1; exit;} " /tmp/f1.txt) 
$ perl -ple "s/(.*$tgt)(.*)/\1$key/" /tmp/f2.txt 
This is a sample sentence **unix** is the key 
This is line 2 and **unix** is the key 

(注意" VS更常見'以便使用的$tgt$key值。)

同方法可以與awksed一起使用,但是我認爲正則表達式有點難度(至少對我而言)。

+0

謝謝顯示文件2的輸出。不能把它寫回文件2嗎? – user168983 2015-02-09 19:38:23

+0

只需將'-i'命令行開關添加到Perl。閱讀[perlrun中的命令切換](http://perldoc.perl.org/perlrun.html#Command-Switches)以獲取更多信息。使用'-ibak'來保留備份副本。 – dawg 2015-02-09 19:51:00

相關問題