读取一个字符串直到关键字,并用UNIX中的另一个字符串替换字符
我是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
但我无法弄清楚如何可以结合搜索和替换。 任何人都可以告诉我如何完成上述任何建议或帮助表示赞赏。
在此先感谢
对于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
值。)
同方法可以与awk
或sed
一起使用,但是我认为正则表达式有点难度(至少对我而言)。
谢谢显示文件2的输出。不能把它写回文件2吗? – user168983 2015-02-09 19:38:23
只需将'-i'命令行开关添加到Perl。阅读[perlrun中的命令切换](http://perldoc.perl.org/perlrun.html#Command-Switches)以获取更多信息。使用'-ibak'来保留备份副本。 – dawg 2015-02-09 19:51:00
你打算如何调用脚本? 'mangle unix file1 file2'?你如何处理'file1'包含一行'blah unix是关键'的情况,另一个说法是'blah blah unix是万能药'? 'file1'中的第二行(和后续行)的含义是什么?如果'file1'在第一行或任何行中不包含关键字会发生什么?据推测,'file2'中不包含关键字的行将保持不变?问题的规范尚未完整 - 这可能是您难以展示自己尝试过的原因的原因。 – 2015-02-08 17:37:29
这只是一个例子。考虑两个包含共同密钥的字符串。第一个关键字后面的字符串应该被第二个关键字后面的字符串替换。如果关键词不存在,请保持原样。我是unix的新手,所以我无法弄清楚方法。 – user168983 2015-02-08 17:49:18
最大的问题(在我看来)是“file1'中第二行和后续行的目的是什么?”我不知道你想用他们做什么。他们应该被忽略吗?是否应该验证它们以确保它们与第一行具有相同的结尾文本?你可能是一个新手,但这并不妨碍你思考。 – 2015-02-08 17:58:12