我想用一个来自另一个文件的字符串替换一个文件中的一个字符串。虽然我对这些命令没有经验,但我希望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
请更新此
由于
答案 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 1
或uniq
或其他内容,或查找/创建更精细的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