使用“sed”将几个单词替换为其他单词

使用“sed”将几个单词替换为其他单词

如何使用 更改多个单词sed?例如,我有一个纯文本文件,其内容为

Var_A = 1
Var_B = 2
Var_C = 3

如何将1,2和更改3AAA,BBB和 ,CCC以便生成的文件如下所示:

Var_A = AAA
Var_B = BBB
Var_C = CCC

我尝试过使用这个

sed -i 's/Var_A = 1\nVar_B = 2\nVar_C = 3/Var_A = AAA\nVar_B = BBB\nVar_C = CCC' file.txt

但它根本不起作用。

答案1

您似乎正在寻找有关如何使用sed替换文本的基本测试用例。对于你的情况,我建议使用以下命令:

sed -e '/^Var_A/s/1/AAA/' -e '/^Var_B/s/2/BBB/' -e '/^Var_B/s/3/CCC/' file.txt

这将应用三个“目标”替换命令,检查一行是否以 开头Var_A,如果是,则替换1AAA(依此类推)。

答案2

让我们看看您是否正在寻找这样的东西:

# define the replacement variables
$ a='AAA';b='BBB';c='CCC'
# make each replacement using the variables.
$ sed -e "s/^\(Var_A = \).*$/\1$a/" -e "s/^\(Var_B = \).*$/\1$b/" -e "s/^\(Var_C = \).*$/\1$c/" foo.txt 
Var_A = AAA
Var_B = BBB
Var_C = CCC

由于其目的sed是逐行处理文本,因此尝试匹配新行并不常见,或者至少是一个好主意。

答案3

从字面上理解这个问题,而不试图弄清楚它是什么实际上发生:

$ cut -d ' ' -f -2 file | paste -d ' ' - <( printf '%s\n' AAA BBB CCC )
Var_A = AAA
Var_B = BBB
Var_C = CCC

这会丢弃原始文件中等号后面的值 using cut,然后附加printf使用生成的新值paste


使用sed(和printfpaste):

printf '%s\n' AAA BBB CCC | paste -d @ file - | sed 's/\(= \).*@/\1/'

这会生成完整的原始文件和新数据,并排显示由@字符分隔的两组数据,如下所示:

Var_A = 1@AAA
Var_B = 2@BBB
Var_C = 3@CCC

sed然后用 来替换每行之间=@每行上的所有内容=

答案4

如果您想使用数组,可以使用以下解决方案:

$ v=([1]=AAA BBB CCC)
$ cat <<. | sed -e "s/1/${v[1]}/
> s/2/${v[2]}/
> s/3/${v[3]}/"
> Var_A = 1
> Var_B = 2
> Var_C = 3
> .
Var_A = AAA
Var_B = BBB
Var_C = CCC

您可以将搜索部分修改为选择的变量,然后进行替换。

相关内容