使用grep和sed将一个字符串替换为另一个字符串

时间:2012-07-18 08:13:45

标签: unix sed grep

我想用一个来自另一个文件的字符串替换一个文件中的一个字符串。虽然我对这些命令没有经验,但我希望grep和sed的某些组合可以做到最好。

这让我有点复杂的是,我不知道是什么字符串(我正在尝试自动替换我的文档中的版本号)。我知道在这两种情况下,我正在寻找的字符串(比如说“2.3.4”)前面都是“version:”

所以我可以在“version:”(让我们称之为string1)之后说'查找单词(或其他行或其他可能的单词)并在另一个文件中执行相同的操作(给出string2)并将字符串string1替换为string2。

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

FILE1.TXT

  

这是一个包含
的文件   更新的版本号。
  版本:2.3.4
  这是一个包含更多信息的字符串

FILE2.TXT

  

这是配置文件
  它可能包含旧版本号   版本:2.3.2
  请更新此

因此file2.txt的预期输出将变为:

FILE2.TXT

  

这是配置文件
  它可能包含旧版本号   版本:2.3.4
  请更新此

由于

2 个答案:

答案 0 :(得分:2)

如果您的sed支持-i选项,

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

您可能想要调整正则表达式通配符; .*匹配到行尾,而[.0-9]*匹配最长的点和数字序列。您可能还希望允许周围空白的变化......但由于这可能是本网站上排名前10%的常见问题解答,所以此时请查找类似的问题。

从file1获取替换字符串并将其应用于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调用只会打印找到并删除“version:”的行(替换为空字符串)。据推测,文件中只有一行这样的行。将输出传递给head -n 1uniq或其他内容,或查找/创建更精细的sed脚本。

您通常在文字字符串周围使用单引号,但由于您不想在替换中使用文字$new,因此我们使用双引号,这允许shell执行变量替换(以及许多其他替换)我们不会在引用的字符串中进入这里。

答案 1 :(得分: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