如何使用 更改多个单词sed
?例如,我有一个纯文本文件,其内容为
Var_A = 1
Var_B = 2
Var_C = 3
如何将1
,2
和更改3
为AAA
,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
,如果是,则替换1
为AAA
(依此类推)。
答案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
(和printf
和paste
):
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
您可以将搜索部分修改为选择的变量,然后进行替换。