2015-02-08 127 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

相关问题