我正在尝试使用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
有关此问题的任何帮助
谢谢
答案 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