2

我想用另一个文件中的字符串替换一个文件中的一个字符串。尽管我对这些命令没有经验,但我希望 grep 和 sed 的某种组合会做得最好。

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

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

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

文件1.txt

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

文件2.txt

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

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

文件2.txt

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

谢谢

4

2 回答 2

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调用将仅打印找到并删除“版本:”的行(替换为空字符串)。大概文件中只有这样的一行。将输出通过管道传输到head -n 1oruniq或其他东西,或者查找/创建更精细的sed脚本。

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

于 2012-07-18T08:17:39.270 回答
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
于 2012-07-18T09:23:40.620 回答