我想在文本文件中的“开始”一词之后附加一个变量。
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
这会查找字符串begin
,file
当匹配时,标准输入上的任何内容都会被插入。我们$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
新文件替换旧文件