在文本文件中插入变量

时间:2018-03-09 20:43:06

标签: bash sed

我正在尝试使用sed -i命令在文本文件的第1行插入字符串变量。 此命令有效:sed -i '1st header' file.txt 但是当我传递变量时,这不起作用。 例如:

var=$(cat <<-END
    This is line one.
    This is line two.
    This is line three.
END
)

sed -i '1i $var' file.txt # doesn't work
sed -i ’1i $var’ file.txt # doesn't work

有关此问题的任何帮助

谢谢

3 个答案:

答案 0 :(得分:1)

首先,让我们以更简单的方式定义您的变量:

$ var="This is line one.
This is line two.
This is line three."

由于sed不擅长使用变量,所以让我们使用awk。这会将您的变量放在文件的开头:

awk -v x="$var" 'NR==1{print x} 1' file.txt

如何运作

  • -v x="$var"

    这定义了一个awk变量x,它具有shell变量$var的值。

  • NR==1{print x}

    在第一行,这告诉awk插入变量x的值。

  • 1

    这是打印线的简写。

实施例

让我们定义你的变量:

$ var="This is line one.
> This is line two.
> This is line three."

让我们处理这个测试文件:

$ cat File
1
2

这是awk命令产生的:

$ awk -v x="$var" 'NR==1{print x} 1' File
This is line one.
This is line two.
This is line three.
1
2

就地更改文件

使用最近的GNU awk更改file.txt

awk -i inplace -v x="$var" 'NR==1{print x} 1' file.txt

在macOS,BSD或更旧的GNU / Linux上,使用:

awk -v x="$var" 'NR==1{print x} 1' file.txt >tmp && mv tmp file.txt

答案 1 :(得分:0)

使用printf ...

$ var="This is line one.
This is line two.
This is line three.
"

使用cat -stdin读取,然后打印到新文件中。如果要修改它,请将其移动到原始文件。

$ printf "$var" | cat - file > newfile && mv newfile file;

答案 2 :(得分:0)

sed不是最好的工作。简单cat怎么样?

cat - file.txt <<EOF > newfile.txt
This is line one.
This is line two.
This is line three.
EOF

# you can add mv, if you really want the original file gone
mv newfile.txt file.txt

对于原始问题 - sed不喜欢其中的新行和空格&#39;程序&#39;,您需要引用并转义换行符:

# this works
sed $'1i "abc\\\ncde"' file.txt

# this does not, executes the `c` command from the second line
sed $'1i "abc\ncde"' file.txt