如何在文本文件中的某个单词后附加变量?

如何在文本文件中的某个单词后附加变量?

我想在文本文件中的“开始”一词之后附加一个变量。 echo $variable给出

rn=45
fg=12
cd=6

我的文本文件看起来像这样

mixture
  Molefraction
  begin
END_OF_FILE

我想要的输出

mixture
  Molefraction
  begin
  rn=45
  fg=12
  cd=6
END_OF_FILE

我正在使用这个sed命令

sed -i "/begin/a $variable" file.txt

这给出了这样的错误消息

sed: -e expression #1, char 56: extra characters after command

答案1

使用sed一个了解“here-strings”的 shell:

$ sed '/begin/r/dev/stdin' file <<<"$variable"
mixture
  Molefraction
  begin
rn=45
fg=12
cd=6
END_OF_FILE

这会查找字符串beginfile当匹配时,标准输入上的任何内容都会被插入。我们$variable通过此处字符串传递标准输入的值。

对于其他 shell,这里的字符串可以简单地替换为printf管道:

$ printf '%s\n' "$variable" | sed '/begin/r/dev/stdin' file
mixture
  Molefraction
  begin
rn=45
fg=12
cd=6
END_OF_FILE

要将其保存到新文件,请在末尾使用重定向。如果您sed支持使用 进行就地编辑sed -i,则可以使用它来修改原始文件(建议在文件的副本上进行测试;运行多次会将数据多次添加到文件中)。

要获得正确的缩进,例如bash

$ ( set -f; IFS=$'\n'; printf '  %s\n' $variable ) | sed  '/begin/r/dev/stdin' file
mixture
  Molefraction
  begin
  rn=45
  fg=12
  cd=6
END_OF_FILE

在这里,我们依靠 shell 的分词来格式化变量的值。我们使用set -f它来确保不会发生文件名通配,然后设置$IFS换行符,并让 shell 将变量的值拆分为换行符分隔的单词。稍作printf修改,在每个单词前面插入两个空格。

答案2

使用awk

awk -v f="$variable" '/begin/{print; print f; next}1' input

这将查找包含 的行begin,打印它,然后打印变量内容,然后移动到下一行。默认只打印任何其他行。

注意:这不会缩进变量,如示例中所示。


使用 GNU awk,您可以使用以下选项就地编辑文件-i

awk -iv f="$variable" '/begin/{print; print f; next}1' input

对于所有其他版本,awk您将需要创建一个新文件:

awk -v f="$variable" '/begin/{print; print f; next}1' input > newfile

如果需要,您可以使用mv新文件替换旧文件

相关内容