如何在shell脚本中使用sed命令替换另一个目录中存在的txt文件中的字符串?

时间:2015-04-27 07:06:44

标签: regex bash shell sed

我对shell脚本非常陌生,并试图学习" sed"命令功能。

我有一个名为configurations.txt的文件,其中定义了一些变量,并为每个变量初始化了一些字符串值。 我试图通过定义的变量的值替换文件(values.txt)中的字符串,该文件存在于某个其他目录中。该文件的名称是values.txt。

configurations.txt中的数据: -

mem="cpu.memory=4G"
proc="cpu.processor=Intel"

values.txt中存在的数据(存在于/ home / cpu / script中): -

cpu.memory=1G
cpu.processor=Dell

我正在尝试制作一个名为repl.sh的shell脚本,我现在还没有很多代码,但这就是我得到的: -

#!/bin/bash
source /home/configurations.txt
sed <need some help here>

预期输出是在应用了适当的正则表达式之后,当我在我的values.txt中运行脚本sh repl.sh时,它必须具有以下数据: -

cpu.memory=4G
cpu.processor=Intell

最初是1G和戴尔。

非常感谢一些快速帮助。感谢

2 个答案:

答案 0 :(得分:1)

这个问题缺乏某种抽象的例程,看起来像“帮我做一些具体的事情”。因此,任何人都不太可能为这个问题提供完整的解决方案。

您应该尝试将此任务拆分为多个小块。

1)迭代X并从每一行获取值。为此,您需要从Y字符串中获取value="X=Y"([^=]+)=\"([^=]+)=([^=]+)\"

这个正则表达式在这里可能会有所帮助 - "。它包含由>> sed -r 's/([^=]+)=\"([^=]+)=([^=]+)\"/\1/' configurations.txt mem proc >> sed -r 's/([^=]+)=\"([^=]+)=([^=]+)\"/\2/' configurations.txt cpu.memory cpu.processor >> sed -r 's/([^=]+)=\"([^=]+)=([^=]+)\"/\3/' configurations.txt 4G Intel 分隔的3个匹配组。例如,

X

2)对于Y中的每个X=Zvalues.txt查找X=Y,并将其替换为cpu.memory

例如,我们使用values.txt更改4G中的>> X=cpu.memory; Y=4G; sed -r "s/(${X}=).*/\1${Y}/" values.txt cpu.memory=4G cpu.processor=Dell 值:

-i

使用{{1}}标记进行更改。

答案 1 :(得分:0)

以下是基于awk的答案:

$ cat config.txt
cpu.memory=4G
cpu.processor=Intel

$ cat values.txt
cpu.memory=1G
cpu.processor=Dell
cpu.speed=4GHz

$ awk -F= 'FNR==NR{a[$1]=$2; next;}; {if($1 in a){$2=a[$1]}}1' OFS== config.txt values.txt 
cpu.memory=4G
cpu.processor=Intel
cpu.speed=4GHz

说明:首先阅读config.txt&amp;保存在内存中。然后阅读values.txt。如果在config.txt中定义了特定值,请使用内存中保存的值(config.txt)。