我对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和戴尔。
非常感谢一些快速帮助。感谢
答案 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=Z
和values.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)。